23種設(shè)計(jì)模式之迭代器模式

工作中很少有自己去寫(xiě)迭代器的情況捉偏,但是有必要了解一下迭代器的內(nèi)部結(jié)構(gòu)捷兰。

優(yōu)點(diǎn):

  • 簡(jiǎn)化了遍歷方式,對(duì)于對(duì)象集合的遍歷固阁,還是比較麻煩的壤躲,對(duì)于數(shù)組或者有序列表,我們尚可以通過(guò)游標(biāo)來(lái)取得您炉,但用戶需要在對(duì)集合了解很清楚的前提下柒爵,自行遍歷對(duì)象,但是對(duì)于hash表來(lái)說(shuō)赚爵,用戶遍歷起來(lái)就比較麻煩了棉胀。而引入了迭代器方法后法瑟,用戶用起來(lái)就簡(jiǎn)單的多了。

  • 可以提供多種遍歷方式唁奢,比如說(shuō)對(duì)有序列表霎挟,我們可以根據(jù)需要提供正序遍歷,倒序遍歷兩種迭代器麻掸,用戶用起來(lái)只需要得到我們實(shí)現(xiàn)好的迭代器酥夭,就可以方便的對(duì)集合進(jìn)行遍歷了。

  • 封裝性良好脊奋,用戶只需要得到迭代器就可以遍歷熬北,而對(duì)于遍歷算法則不用去關(guān)心。

缺點(diǎn):

  • 對(duì)于比較簡(jiǎn)單的遍歷(像數(shù)組或者有序列表)诚隙,使用迭代器方式遍歷較為繁瑣讶隐,大家可能都有感覺(jué),像ArrayList久又,我們寧可愿意使用for循環(huán)和get方法來(lái)遍歷集合巫延。

主要角色:
迭代器角色:一般為接口,主要定義迭代器該有的屬性地消。
具體迭代器角色:主要實(shí)現(xiàn)迭代器角色接口的方法炉峰。
容器角色:數(shù)據(jù)容器。

創(chuàng)建迭代器角色:

/**
 * 這是一個(gè)迭代器接口
 * first 游標(biāo)第一個(gè)對(duì)象
 * next 游標(biāo)下一個(gè)對(duì)象
 * hasNext 游標(biāo)是否存在下一個(gè)對(duì)象
 * isFirst 是否是第一個(gè)對(duì)象
 * isLast 是否是最后一個(gè)對(duì)象
 * getCurrentObj 獲取當(dāng)前對(duì)象
 */

public interface MyIterator {
    void first();

    void next();

    boolean hasNext();

    boolean isFirst();

    boolean isLast();

    Object getCurrentObj();
}

創(chuàng)建容器角色:

import java.util.ArrayList;
import java.util.List;

/**
 * 這是一個(gè)容器對(duì)象
 */

public class ConcreteAggregate {

    private List<Object> list = new ArrayList<Object>();

    //數(shù)據(jù)新增方法
    public void addObject(Object object) {
        this.list.add(object);
    }

    //數(shù)據(jù)刪除方法
    public void removeObject(Object object) {
        this.list.remove(object);
    }

    //獲取list方法
    public List<Object> getList() {
        return list;
    }

    //設(shè)置list方法
    public void setList(List<Object> list) {
        this.list = list;
    }
}

創(chuàng)建具體迭代器角色:

import java.util.List;

/**
 * 這是一個(gè)具體迭代器角色
 * cursor 定義游標(biāo)用于記錄遍歷時(shí)的位置
 */

public class ConcreteIterator implements MyIterator {

    private List<Object> list;
    private int cursor;

    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }

    @Override
    public void first() {
        cursor = 0;
    }

    @Override
    public void next() {
        if (cursor < list.size()) {
            cursor++;
        }
    }

    @Override
    public boolean hasNext() {
        if (cursor < list.size()) {
            return true;
        }
        return false;
    }

    @Override
    public boolean isFirst() {
        return cursor == 0 ? true : false;
    }

    @Override
    public boolean isLast() {
        return cursor == (list.size() - 1) ? true : false;
    }

    @Override
    public Object getCurrentObj() {
        return list.get(cursor);
    }
}

測(cè)試:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

/**
 * 這是調(diào)用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.addObject("張三");
        aggregate.addObject("李四");
        aggregate.addObject("王五");

        MyIterator iterator = new ConcreteIterator(aggregate.getList());
        while (iterator.hasNext()) {
            Log.d("TAG", iterator.getCurrentObj() + "");
            iterator.next();
        }
    }
}

結(jié)果:
image.png

已完成測(cè)試脉执!有不對(duì)的地方歡迎指出疼阔,感恩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末半夷,一起剝皮案震驚了整個(gè)濱河市竿开,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玻熙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疯攒,死亡現(xiàn)場(chǎng)離奇詭異嗦随,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)敬尺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)枚尼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人砂吞,你說(shuō)我怎么就攤上這事署恍。” “怎么了蜻直?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵盯质,是天一觀的道長(zhǎng)袁串。 經(jīng)常有香客問(wèn)我,道長(zhǎng)呼巷,這世上最難降的妖魔是什么囱修? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮王悍,結(jié)果婚禮上破镰,老公的妹妹穿的比我還像新娘。我一直安慰自己压储,他們只是感情好鲜漩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著集惋,像睡著了一般孕似。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芋膘,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天鳞青,我揣著相機(jī)與錄音,去河邊找鬼为朋。 笑死臂拓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的习寸。 我是一名探鬼主播胶惰,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼霞溪!你這毒婦竟也來(lái)了孵滞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸯匹,失蹤者是張志新(化名)和其女友劉穎坊饶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體殴蓬,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匿级,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了染厅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘绎。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肖粮,靈堂內(nèi)的尸體忽然破棺而出孤页,到底是詐尸還是另有隱情,我是刑警寧澤涩馆,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布行施,位于F島的核電站允坚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悲龟。R本人自食惡果不足惜屋讶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望须教。 院中可真熱鬧皿渗,春花似錦、人聲如沸轻腺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贬养。三九已至挤土,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误算,已是汗流浹背仰美。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儿礼,地道東北人咖杂。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚊夫,于是被迫代替她去往敵國(guó)和親诉字。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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