設計模式 行為型 迭代器模式

2021-10-08 14:42:14 字數 1941 閱讀 9935

迭代器模式(iterator design pattern),也叫作游標模式(cursor design pattern)。用來遍歷集合物件。

這裡的「集合物件」也可以叫作「容器」,實際上就是包含一組物件的物件,比如陣列、鍊錶、樹、圖、跳表等,迭代器模式主要是將集合物件的遍歷操作從集合類中拆分,放到迭代器中,讓二者職責更加單一。

迭代器是用來遍歷容器的,所以乙個完整的迭代器模式一般包含容器容器迭代器兩個部分。為了遵循基於介面而非實現程式設計,容器包含容器介面和容器類,迭代器包含迭代器介面和迭代器類。如下圖所示

線性資料結構包括陣列和鍊錶,在大部分程式語言中都有對應的類封裝這兩種資料結構。下面使用陣列來自定義乙個簡單的線性容器。使用迭代器模式將該容器的遍歷操作從中拆分出來。類圖如下:

**實現如下:

/**

* 迭代介面

*/public inte***ce myiterator

/** * 容器介面

*/public inte***ce mylist

/**

* 自定義集合類

* * 底層使用的是陣列

*/public class myarraylistimplements mylist

@override

public boolean add(t obj)

t obj=array[index];

for(int i=index;i=length || index<0)

return array[index];

}@override

public myiterator iterator()

}/**

* 自定義myarraylist的迭代類

*/public class myarrayiteratorimplements myiterator

@override

public boolean hasnext()

@override

public void next()

@override

public t currentitem()

return arraylist.get(cursor);}}

測試:

@test

public void test()else }}

輸出結果:

上述**實現比較簡單,就不進行詳解了。 這裡需要注意的是,如果使用鍊錶實現容器mylinkedlist。那麼其對應的容器迭代類mylinkediterator需要重新實現,與之匹配。

遍歷集合的方式有三種方式:for迴圈、foreach迴圈、迭代器遍歷。後兩者的本質上是同一種,都可以看作迭代器遍歷。相對於for迴圈遍歷。為什麼還要使用迭代器模式呢?

1、對於類似陣列和鍊錶這種簡單的資料結構,遍歷方式比較簡單,使用for迴圈來遍歷也是夠用的。如果底層的資料結構比較複雜(如圖,樹),其遍歷方式就比較複雜了。使用迭代器模式封裝了集合內部複雜的資料結構,開發者就不需要理解如何遍歷的了,直接使用遍歷器介面即可

2、迭代器模式將集合物件的遍歷操作從集合類中進行了拆分,放到迭代器中,使職責更加單一

3、迭代器模式新增新的遍歷演算法更加容易,更符合開閉原則。基於介面程式設計,可以快速的替換迭代器。

參考:設計模式之美-王爭

設計模式 迭代器模式 行為型

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。適用性 1.訪問乙個聚合物件的內容而無需暴露它的內部表示。2.支援對聚合物件的多種遍歷。3.為遍歷不同的聚合結構提供乙個統一的介面 即,支援多型迭代 類結構圖head first結構圖 系統結構圖 具體迭...

設計模式之迭代器模式 行為型

迭代器模式 iterator pattern 提供一種方法來訪問聚合物件,而不用暴露這個物件的內部表示,其別名為游標 cursor 所以迭代器模式是一種物件行為型。對於迭代器模式來說,乙個聚合可以有多個遍歷。在迭代器模式中,提供了乙個外部的迭代器對聚合物件進行訪問和遍歷,迭代器定義了乙個訪問聚合物件...

設計模式 行為型 4 迭代器模式

1.模式動機 3.模式結構 迭代器模式包含如下角色 將遍歷資料的行為從聚合物件中分離出來,封裝在迭代器物件中 由迭代器來提供遍歷聚合物件內部資料的行為,簡化聚合物件的設計,更符合單一職責原則 抽象迭代器示例 public inte ce iterator 具體迭代器示例 public class c...