白話設計模式系列之迭代器模式

以下為本人寫的其他設計模式,感興趣的同學可以查閱。

白話設計模式之菜鳥提升篇

此頭條號中已經發布了其他設計模式,感興趣的同學可以關注我後進行查閱,同時獲取後序更多模式及其他資訊。

迭代器模式(Iterator Pattern)

透過一個方法來遍歷聚合物件(List,Set等集合或者是一類物件的集合),聚合物件內部方法無需暴露給使用者,它將聚合物件的遍歷的遍歷功能從聚合物件中分離出來,聚合物件只負責儲存(增,刪,改)資料,遍歷聚合物件資料由迭代器完成。Java中集合的遍歷就是典型的迭代器模式(它是在集合類中以內部類的形式實現迭代器的)。

工廠模式的迭代器

迭代器模式中包含了兩個層次:聚合物件和迭代器,為了實現不同具體聚合物件擁有不同的具體迭代器,我們使用工廠模式實現聚合物件和迭代器物件的組合。模式基本結構圖如下所示:

白話設計模式系列之迭代器模式

工廠模式+迭代器

Collection(抽象聚合物件)

:它定義了聚合物件儲存元素的方法,同時聲明瞭一個createIterator()方法用於獲取迭代器(充當了抽象迭代器的工廠角色)。

MyList(具體聚合物件)

:它實現了抽象聚合物件的createIterator方法,同時返回一個與該聚合物件對應的具體迭代器物件。程式碼片段如下所示:

白話設計模式系列之迭代器模式

MyList

Iterator(抽象迭代器物件)

:它定義了遍歷聚合物件元素的一系列方法。

MyIterator(具體迭代器物件)

:它實現了抽象迭代器物件的方法,用於操作具體聚合物件的元素。程式碼片段如下所示:

白話設計模式系列之迭代器模式

MyIterator

內部類模式的迭代器

以上述案例為基礎進行修改,它的基本結構是:MyList(具體聚合物件)、Iterator(抽象迭代器物件)、MyIterator(具體迭代器物件);與工廠模式迭代器不同的地方是:MyList的createIterator方法在建立的不MyIterator的例項,而是MyIterator的內部類例項;MyIterator中實現一個內部類,用於實現聚合物件元素的遍歷操作。(Java的集合遍歷就是典型的內部類模式的迭代器)程式碼片段如下所示:

白話設計模式系列之迭代器模式

MyIterator

白話設計模式系列之迭代器模式

MyList

總結

優點

針對不同的聚合物件定義不同的迭代器物件,聚合物件迭代方式改變時,只需要增加或者替換原有的迭代器物件即可,同時一個聚合物件還可以支援多種不同的迭代器。

迭代器的使用簡化了聚合類物件,聚合物件不在要提供資料遍歷方法,它只需要做好資料的儲存即可。

迭代器物件是抽象的,在擴充套件新的迭代器物件時,無需修改原始碼,符合開放閉合原則。

缺點

因為聚合物件分離的資料的遍歷方法,那麼每個聚合物件都會擁有一個對應的迭代器物件,如果新增聚合物件,則會造成系統類個數的成對增加,提升了系統的複雜度。

抽象迭代器的定義和設計比較困難,需要考慮到很多聚合物件的遍歷情況。(可能每種聚合物件的遍歷演算法不一樣,或者有部分聚合物件較其他聚合物件特殊)

白話設計模式系列就先寫到這裡,如有問題,歡迎吐槽。在此特別感謝design-pattern-java一書的作者,是他讓我開始對設計模式產生了感覺。地球不爆炸,我們不放假,good good study day day up !!如有幫助請多多關注!點贊。接下來還會有更多內容輸出,喜歡的朋友可以關注。