迭代器模式

一、模式簡(jiǎn)介

定義:提供一個(gè)對(duì)象來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示。
場(chǎng)景:遍歷不同的聚合結(jié)構(gòu)提供統(tǒng)一的接口。訪問(wèn)聚合對(duì)象的內(nèi)容而無(wú)須暴露其內(nèi)部細(xì)節(jié)的表示。

  • 角色結(jié)構(gòu):
  • 抽象聚合(Aggregate)角色:定義存儲(chǔ)、添加、刪除聚合對(duì)象以及創(chuàng)建迭代器對(duì)象的接口。
  • 具體聚合(Concrete Aggregate)角色:實(shí)現(xiàn)抽象聚合類,返回一個(gè)具體迭代器的實(shí)例。
  • 抽象迭代器(Iterator)角色:定義訪問(wèn)和遍歷聚合元素的接口。
  • 具體迭代器(Concrete lterator)角色:實(shí)現(xiàn)抽象迭代器接口中所定義的方法,完成對(duì)聚合對(duì)象的遍歷,記錄遍歷的當(dāng)前位置。

二、模式實(shí)現(xiàn)

public interface AbstractAggregate { -> 抽象聚合
    void add(Object o);
    void remove(Object o);
    AbstractIterator iterator();
}

public class ConcreteAggregate implements AbstractAggregate { -> 具體聚合
    private List<Object> list = new ArrayList<>();

    @Override
    public void add(Object o) {
        list.add(o);
    }

    @Override
    public void remove(Object o) {
        list.remove(o);
    }

    @Override
    public AbstractIterator iterator() {
        return new ConcreteIterator(list);
    }
}

public interface AbstractIterator { -> 抽象迭代
    Object first();
    Object next();
    boolean hasNext();
    void remove();
}

public class ConcreteIterator implements AbstractIterator { -> 具體迭代
    private List<Object> list;
    private int index = -1;

    public ConcreteIterator(List<Object> list) {
        if (list != null) {
            this.list = list;
        } else {
            this.list = new ArrayList<>();
        }
    }

    @Override
    public Object first() {
        return list.size() > 0 ? list.get(0) : null;
    }

    @Override
    public Object next() {
        return hasNext() ? list.get(++index) : null;
    }

    @Override
    public boolean hasNext() {
        return index < list.size() - 1;
    }

    @Override
    public void remove() {
        if (index >= 0 && list.size() > index) {
            list.remove(index);
            index--;
        }
    }
}

以遍歷集合輸出每個(gè)元素的信息為例子

AbstractAggregate aggregate = new ConcreteAggregate();
aggregate.add("w");
aggregate.add("j");
aggregate.add("x");
AbstractIterator iterator = aggregate.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next().toString());
    iterator.remove();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容