設計模式-迭代子模式

設計模式 技術 搞技術的老唐 搞技術的老唐 2017-10-07

迭代子模式可以順序的訪問集合內部的元素而不必知道集合內部表象。

多個對象聚集在一起形成集合的概念,所以集合對象也叫容器,包含 n 多對象的池子一樣。集合對象需要提供一些方法,使得可以順序訪問內部對象。集合對象常見的問題分為兩類,一是把一種集合對象轉換為另外一個集合對象,由於集合對象各自的遍歷集合不同,這裡就需要修改客戶端代碼了(違背開閉原則);二是集合本身不變,迭代方法改變,這個時候需要修改集合對象。這兩個問題都涉及到需要修改代碼,也就違背了開閉原則(能夠在不修改代碼的情況下對功能進行擴展,開閉原則其實是需要把不變的與易變的進行分割)。針對這樣的問題,在客戶端和集合對象之間增加一個迭代子這麼一箇中間層,使得客戶端和集合對象之間由直接變成間接,降低耦合力度。

迭代子模式的類圖大概如下所示

設計模式-迭代子模式

Aggregate集合:創建迭代子的接口;

ConcreteAggregate 具體集合:實現迭代子接口;

Iterator 迭代子接口:給出迭代每個元素的接口;

ConcreteIterator 具體迭代子:實現迭代方法。

如果一個集合對象對外提供了修改內部元素的方法,那麼這個接口就叫寬接口;如果不對外提供修改元素的方法,就叫窄接口
,其實這叫法我覺得無所謂,關鍵是集合類對外提供修改接口,就破壞了集合對象的封裝,而此時的迭代子在外部控制元素的迭代,作用相當於一個遊標,有個雅稱叫遊標迭代子;改良的做法是集合對象對外不提供對元素的修改方法,只對迭代子提供寬接口。

下面使用代碼更加形象的說明之。

集合類提供幾個方法,第一個是獲取迭代子;第二個是獲得指定位置的元素了第三是獲取集合元素的數量;

設計模式-迭代子模式

具體集合類的實現,這裡使用一個數組作為靜態的內部元素,如果使用動態外部的元素需要改造

設計模式-迭代子模式

抽象迭代子

設計模式-迭代子模式

一個具體的實現

設計模式-迭代子模式

來個客戶端運行下看看

設計模式-迭代子模式

可以打印出A、B、C,而且可以新增新的迭代子和新的集合類實現來進行不同的順序輸出。

迭代子模式的意義是使得客戶端與迭代子任務分開,使二者各自完成自己的主要工作,在集合對象發生改變或者迭代方法發生變化的時候,有了這個迭代子緩衝地帶,我們可以儘量只對迭代子部分進行修改。並不是說客戶端自己不可以迭代,只是不夠優雅。

迭代子把集合的循環迭代方法進行了處理,集合本身不需要迭代;集合本身可以包含不僅一個的迭代子,根據情況獲取不同的迭代子,進行不同的迭代子處理;遍歷算法包括迭代子內部,因此迭代子獨立於集合。迭代子的缺點是對象總是 Object 的,這個需要顯示的強制轉換。

相關推薦

推薦中...