日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式之_Iterator_04

發布時間:2024/4/13 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之_Iterator_04 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.learn.dp.iterator;public class Cat {public Cat(int id) {super();this.id = id;}/*** Cat只有一個屬性id*/private int id;public int getId() {return id;}public void setId(int id) {this.id = id;}/*** 我給貓加一個toString方法*/public String toString() {return "Cat [id=" + id + "]";}} package com.learn.dp.iterator;public interface Collection {void add(Object o);int size();/*** 返回值是Iterator* @return*/Iterator iterator(); } package com.learn.dp.iterator;public class ArrayList implements Collection {Object[] objects = new Object[10];int index = 0;public void add(Object o) {if(index==objects.length) {Object[] newObjects = new Object[objects.length * 2];System.arraycopy(objects, 0, newObjects, 0, objects.length);objects = newObjects;}objects[index] = o;index++;}public int size() {return index;}/*** ArrayList實現了一個方法,方法的返回值是Iterator接口的類型,* 它的方法名就叫做iterator(),我現在先不管怎么實現* 怎么實現我先不管,下面我們就來寫一個實現,你返回這個東西,一定是實現Iterator接口那個類的一個對象* 至于這個類叫什么名,其實并不重要,我完全可以寫一個匿名類,不過簡單起見我寫一個內部類,*/public Iterator iterator() {/*** 別人要我去拿遍歷,如果你用單例模式你都不用new,你只要有一個單例放在對象就可以* 簡單起見我就return new*/return new ArrayListIterator();}/*** 它必須去實現一個接口Iterator,添加要實現的方法* 兩個方法,一個叫hasNext,一個叫next,其實具體怎么實現你都不用管* * 最關心的是他一定實現了hasNext和next方法,具體怎么實現和這個容器相關,你如說數組就和數組相關* 你就用它的下標值,如果是鏈表你就用鏈表的方式來遍歷,對于我們客戶來說,很簡單* */private class ArrayListIterator implements Iterator {/*** 必須得記錄當前我們存到哪了,已經訪問到什么地方了*/private int currentIndex = 0; /*** hasNext指的是到底有沒有下一個,作為一個數組來講,它有沒有下一個值,這個應該怎樣來判斷,* 只要判斷一下index的值,目前index的值到底是多少,想一下這個業務邏輯,問這個數組到底有沒有下一個* */@Overridepublic boolean hasNext() {/*** 每當有沒有下一個的時候我們只要判斷一下* 或者currentIndex大于包裝類的index的值了,這個時候就沒有下一個了* objects[currentIndex]==null這個空值也是有值* * index本身記錄了所有的數,但是真正的位置是需要減1的,因為是從0開始的*/if(currentIndex >= index) {return false;}else {return true;}}@Overridepublic Object next() {Object o = objects[currentIndex];/*** 既然拿走一個了,拿下一個就得加加了*/currentIndex++;return o;}}} package com.learn.dp.iterator;/*** 我不想具體的實現是什么,當我們有了這么一個接口之后,* 我要求任何一個容器必須實現這個接口類的對象,具體的實現交給你容器自己去實現* 你實現完了之后我肯定知道一個對象實現了兩個方法了,那么用這兩個方法就完全可以實現對你這個容器的遍歷* * 我現在定義一個Iterator接口* @author Leon.Sun**/ public interface Iterator {/*** 第一個返回值是一個Object,*/Object next();boolean hasNext(); } package com.learn.dp.iterator;/*** 我們現在想遍歷該怎么辦,大家想一下,站在使用者的角度* 現在ArrayList已經寫好了,你看不到源碼,* @author Leon.Sun**/ public class MainTest {public static void main(String[] args) {// LinkedList ll = new LinkedList();Collection c = new ArrayList();for(int i=0;i<15;i++) {c.add(new Cat(i));}/*** 既然我是一個ArrayList,先把c強制轉換成ArrayList*/ArrayList al = (ArrayList)c;/*** 然后再給你遍歷,index是有多少個了* 你有沒有發現這種寫法很別扭,別扭的是加入我把上面編程LinkedList的話,* 這部分代碼百分百是需要變的,因為LinkedList是另外一種遍歷方式,你得用鏈表的方式遍歷* 從頭開始,一直遍歷到結尾,那這個時候就非常的別扭了,作為容器經常使用的操作就是遍歷,* 可是遍歷的時候你不能統一,你不能統一的話就沒有意義,你使用別的實現的話,下面的遍歷全都變,* 那我們能不能找到統一的遍歷方式,你在具體實現上想是想不出來的,每一種遍歷的方式都不一樣,* 我用數組來遍歷,我用鏈表遍歷用指針可以,我用二叉樹來遍歷你必須需要自己去寫遍歷算法,* 每一種容器都要有自己的遍歷方式,而這種方式我要想方設法的去統一起來,但是每種容器的具體的實現都不太一樣* 那我統一這種遍歷方式,只能用共同的實現方式,怎么接口或者抽象類的方式,所以我就這么寫,我要統一所有容器的遍歷方式* 我就要求所有的容器必須給我提供*/for(int i=0;i<al.index;i++) {}/*** 由于我們遍歷的是接口,所以我們最好在Collection里定義好* 我就可以遍歷它了,一旦我們定義了這么一個接口,不管它怎么去實現他,* 由于實現我是交給具體的容器類去實現,它愛怎么實現就怎么實現* 實現是他的事,只要我定義了一個統一的接口,我就可以用一個統一的方式來遍歷它,* * 對于我們的客戶來說,只要拿到它的Iterator,那個類叫什么名和我有關系嗎,一點關系都沒有* 管都不用管,反正他已經實現了hasNext方法,反正他一定實現了next方法,* 他一定能夠實現我要的遍歷* * 你看不到源碼,難道就不能去調用iterator了嗎,當然可以,所以大家想一下,* 這個iterator()返回的是一個接口的對象,其實是這個容器實現了這個接口那個類的對象,* 具體怎么實現的跟我有關系嗎,如果你只是想用它的話一點關系都沒有,拿來用就行了* 這段有點繞,我們觀察一下JDK自己實現的方式,看看是不是和我們的方式一樣,java.util中有一個Collection* Collection有一個子類AbstractList,AbstractList有一個子類叫ArrayList,ArrayList從AbstractList繼承* AbstractList本身又實現了Collection接口,跟我們模擬的一樣,在Collection接口里面,* 他又一個方法叫iterator(),實現一個叫做泛型的方式Iterator<T>,所以要求實現這個接口的那些個類都必須實現這個方法iterator()* 實現了Iterator<>接口的兩個方法hasNext()和next(),具體是什么跟我有關系嗎,沒關系,如果你只是想用它的話* iterator到底是干嘛使的,返回的接口到底是什么意思,*/Iterator it = c.iterator();/*** 如果你有下一個,那么我就可以拿出下一個來* 有了重寫的toString方法,我可以直接打印*/while(it.hasNext()) {Object o = it.next();System.out.println(o + " ");}} } Cat [id=0] Cat [id=1] Cat [id=2] Cat [id=3] Cat [id=4] Cat [id=5] Cat [id=6] Cat [id=7] Cat [id=8] Cat [id=9] Cat [id=10] Cat [id=11] Cat [id=12] Cat [id=13] Cat [id=14]

?

總結

以上是生活随笔為你收集整理的设计模式之_Iterator_04的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。