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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

设计模式之迭代子模式

發布時間:2024/9/21 asp.net 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之迭代子模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

迭代子模式又叫游標(Cursor)模式,是對象的行為模式。

迭代子模式的定義

迭代子模式可以順序地訪問一個聚集中的元素而不必暴露聚集的內部表象。我們常見的集合有很多種類,其頂層數據存儲和組織方式的不同導致了我們在對數據進行遍歷的時候存在一些差異,迭代器模式就是通過實現某種統一的方式來實現對不同的集合的遍歷,同時又不暴露出其底層的數據存儲和組織方式。

例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引:

for(int i=0; i<array.size(); i++) { get(i) } 復制代碼

而訪問一個鏈表(LinkedList)又必須使用while循環:

while((e=e.next())!=null) { e.data() } 復制代碼

以上兩種方法客戶端都必須事先知道集合的內部結構,訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端代碼中分離出來,每一種集合對應一種遍歷方法,客戶端代碼無法復用。

更恐怖的是,如果以后需要把ArrayList更換為LinkedList,則原來的客戶端代碼必須全部重寫。

為解決以上問題,Iterator模式總是用同一種邏輯來遍歷集合:

for(Iterator it = yourCollection.iterater(); it.hasNext(); ) { ... } 復制代碼

客戶端自身不維護遍歷集合的"指針",所有的內部狀態(如當前元素位置,是否有下一個元素)都由Iterator來維護,而這個Iterator由集合類通過工廠方法生成,因此,它知道如何遍歷整個集合??蛻舳藦牟恢苯雍图项惔蚪坏?#xff0c;它總是控制Iterator,向它發送"向前","向后","取當前元素"的命令,就可以間接遍歷整個集合。

迭代子模式的結構

迭代模式中有如下的角色:

迭代子模式的結構

  • 迭代器角色(Iterator): 負責定義訪問和遍歷元素的接口。
  • 具體迭代器角色(Concrete Iterator):實現迭代器接口,并要記錄遍歷中的當前位置。
  • 容器角色(Container): 負責提供創建具體迭代器角色的接口。
  • 具體容器角色(Concrete Container):實現創建具體迭代器角色的接口, 這個具體迭代器角色與該容器的結構相關。

迭代子模式的實現

迭代器接口實現,定義了獲取第一個節點的方法,前一個節點和后一個節點,以及判斷是否有下一個節點。

public interface Iterator {public Object first();public Object previous();public Object next();public boolean hasNext(); } 復制代碼

具體實現迭代器,實現上述接口定義的方法。

public class MyIterator implements Iterator{private List<Object> list;private int index = 0;public MyIterator(List<Object> list) {this.list = list;}@Overridepublic Object previous() {if((this.index - 1) < 0){return null;}else{return this.list.get(--index);}}@Overridepublic Object next() {if((this.index + 1) >= this.list.size()){return null;}else{return this.list.get(++index);}}@Overridepublic boolean hasNext() {if(this.index < (this.list.size() - 1)){return true;}return false;}@Overridepublic Object first() {if(this.list.size() <= 0){return null;}else{return this.list.get(0);}} } 復制代碼

容器定義,定義了兩個抽象方法,用來設置具體的迭代器實現以及注入容器中的元素。

public abstract class Container {public abstract Iterator iterator();public abstract void put(Object obj); } 復制代碼

具體的容器類基于List,實現抽象方法。

public class MyContainer extends Container{private List<Object> list;public MyContainer() {this.list = new ArrayList<Object>();}@Overridepublic void put(Object obj){this.list.add(obj);}@Overridepublic Iterator iterator() {return new MyIterator(list);} } 復制代碼

客戶端測試類。設置元素,并使用迭代器進行遍歷。

public class ClientTest {public static void main(String[] args) {//創建一個自定義容器,直接使用ArrayList的實現Container strContainer = new MyContainer();strContainer.put("001");strContainer.put("002");Iterator myIterator = strContainer.iterator();//使用迭代器遍歷System.out.println(myIterator.first());while (myIterator.hasNext()) {System.out.println(myIterator.next());}} } 復制代碼

類圖

總結

Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。

適用場景:

  • 訪問一個聚合對象的內容而無須暴露它的內部表示。
  • 需要為聚合對象提供多種遍歷方式。
  • 為遍歷不同的聚合結構提供一個統一的接口。

優點:

  • 它支持以不同的方式遍歷一個聚合對象。
  • 迭代器簡化了聚合類。在同一個聚合上可以有多個遍歷。
  • 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼。
  • 系統需要訪問一個聚合對象的內容而無需暴露它的內部表示。

缺點:

  • 由于迭代器模式將存儲數據和遍歷數據的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的復雜性。
  • 迭代器模式在遍歷的同時更改迭代器所在的集合結構會導致出現異常。所以使用foreach語句只能在對集合進行遍歷,不能在遍歷的同時更改集合中的元素。

訂閱最新文章,歡迎關注我的公眾號

參考

  • java設計模式----迭代子模式
  • Head First設計模式之迭代器模式
  • 總結

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

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