設(shè)計(jì)模式-迭代子模式

迭代子模式可以順序的訪問集合內(nèi)部的元素而不必知道集合內(nèi)部表象帆精。

多個對象聚集在一起形成集合的概念叉弦,所以集合對象也叫容器川尖,包含 n 多對象的池子一樣登下。集合對象需要提供一些方法,使得可以順序訪問內(nèi)部對象叮喳。集合對象常見的問題分為兩類被芳,一是把一種集合對象轉(zhuǎn)換為另外一個集合對象,由于集合對象各自的遍歷集合不同馍悟,這里就需要修改客戶端代碼了(違背開閉原則)畔濒;二是集合本身不變,迭代方法改變锣咒,這個時候需要修改集合對象侵状。這兩個問題都涉及到需要修改代碼,也就違背了開閉原則(能夠在不修改代碼的情況下對功能進(jìn)行擴(kuò)展毅整,開閉原則其實(shí)是需要把不變的與易變的進(jìn)行分割)趣兄。針對這樣的問題,在客戶端和集合對象之間增加一個迭代子這么一個中間層悼嫉,使得客戶端和集合對象之間由直接變成間接艇潭,降低耦合力度。

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


Aggregate集合:創(chuàng)建迭代子的接口;
ConcreteAggregate 具體集合:實(shí)現(xiàn)迭代子接口蹋凝;
Iterator 迭代子接口:給出迭代每個元素的接口鲁纠;
ConcreteIterator 具體迭代子:實(shí)現(xiàn)迭代方法。

如果一個集合對象對外提供了修改內(nèi)部元素的方法鳍寂,那么這個接口就叫寬接口改含;如果不對外提供修改元素的方法,就叫窄接口,其實(shí)這叫法我覺得無所謂迄汛,關(guān)鍵是集合類對外提供修改接口捍壤,就破壞了集合對象的封裝,而此時的迭代子在外部控制元素的迭代隔心,作用相當(dāng)于一個游標(biāo),有個雅稱叫游標(biāo)迭代子尚胞;改良的做法是集合對象對外不提供對元素的修改方法硬霍,只對迭代子提供寬接口。

下面使用代碼更加形象的說明之笼裳。
集合類提供幾個方法唯卖,第一個是獲取迭代子;第二個是獲得指定位置的元素了第三是獲取集合元素的數(shù)量躬柬;

public abstract class Aggregate {

    public abstract MyIterator iterator();
    
    public abstract Object getElement(int index);
    
    public abstract int size();
}

具體集合類的實(shí)現(xiàn),這里使用一個數(shù)組作為靜態(tài)的內(nèi)部元素拜轨,如果使用動態(tài)外部的元素需要改造

public class ConcreteAggregate extends Aggregate{

    private String[]arr={"A","B","C"};
    
    @Override
    public MyIterator iterator() {
        return new ConcreteIterator(this);
    }
    
    public Object getElement(int index){
        return arr[index];
    }
    
    public int size(){
        return arr.length;
    }

}

抽象迭代子

public interface MyIterator {
    //移動到第一個對象
    public void first();
    //是否最后
    public boolean isLast();
    //移動下一個
    public void next();
    //當(dāng)前對象
    public Object current();
}

一個具體的實(shí)現(xiàn)

public class ConcreteIterator implements MyIterator{

    Aggregate agg;
    int size=0;
    int index=0;
    
    public ConcreteIterator(Aggregate agg) {
        this.agg=agg;
        size=agg.size();
    }
    
    @Override
    public void first() {
        index=0;
        
    }

    @Override
    public boolean isLast() {
        return index>=size;
    }

    @Override
    public void next() {
        if(index<size){
            index++;
        }
        
    }

    @Override
    public Object current() {
        return agg.getElement(index);
    }

}

來個客戶端運(yùn)行下看看

public class Client {

    public static void main(String[] args) {
        Aggregate agg=new ConcreteAggregate();
        MyIterator iterator = agg.iterator();
        //可以把 isLast 和 next 方法整合到一起
        while(!iterator.isLast()){
            System.out.println(iterator.current());
            iterator.next();
        }
    }
}

可以打印出A、B允青、C橄碾,而且可以新增新的迭代子和新的集合類實(shí)現(xiàn)來進(jìn)行不同的順序輸出。
迭代子模式的意義是使得客戶端與迭代子任務(wù)分開颠锉,使二者各自完成自己的主要工作法牲,在集合對象發(fā)生改變或者迭代方法發(fā)生變化的時候,有了這個迭代子緩沖地帶琼掠,我們可以盡量只對迭代子部分進(jìn)行修改拒垃。并不是說客戶端自己不可以迭代,只是不夠優(yōu)雅瓷蛙。

迭代子把集合的循環(huán)迭代方法進(jìn)行了處理悼瓮,集合本身不需要迭代;集合本身可以包含不僅一個的迭代子艰猬,根據(jù)情況獲取不同的迭代子横堡,進(jìn)行不同的迭代子處理;遍歷算法包括迭代子內(nèi)部冠桃,因此迭代子獨(dú)立于集合翅萤。迭代子的缺點(diǎn)是對象總是 Object 的,這個需要顯示的強(qiáng)制轉(zhuǎn)換。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末套么,一起剝皮案震驚了整個濱河市培己,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胚泌,老刑警劉巖省咨,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玷室,居然都是意外死亡零蓉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門穷缤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌蜂,“玉大人,你說我怎么就攤上這事津肛≌潞恚” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵身坐,是天一觀的道長秸脱。 經(jīng)常有香客問我,道長部蛇,這世上最難降的妖魔是什么摊唇? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涯鲁,結(jié)果婚禮上巷查,老公的妹妹穿的比我還像新娘。我一直安慰自己抹腿,他們只是感情好吮便,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幢踏,像睡著了一般髓需。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上房蝉,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天僚匆,我揣著相機(jī)與錄音,去河邊找鬼搭幻。 笑死咧擂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的檀蹋。 我是一名探鬼主播松申,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贸桶?” 一聲冷哼從身側(cè)響起舅逸,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皇筛,沒想到半個月后琉历,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡水醋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年旗笔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拄踪。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝇恶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惶桐,到底是詐尸還是另有隱情撮弧,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布耀盗,位于F島的核電站想虎,受9級特大地震影響卦尊,放射性物質(zhì)發(fā)生泄漏叛拷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一岂却、第九天 我趴在偏房一處隱蔽的房頂上張望忿薇。 院中可真熱鬧,春花似錦躏哩、人聲如沸署浩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筋栋。三九已至,卻和暖如春正驻,著一層夾襖步出監(jiān)牢的瞬間弊攘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工姑曙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留襟交,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓伤靠,卻偏偏與公主長得像捣域,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容