迭代器模式(lterator Pattern)简介
定義
迭代器模式(lterator Pattern)又稱為游標(biāo)模式(Cursor Pattern),它提供一種順序訪問集合或容器對象元素的方法,而又無須暴露集合內(nèi)部表示。迭代器模式可以為不同的容器提供一致的遍歷行為,而不用關(guān)心容器內(nèi)容元素組成結(jié)構(gòu),屬于行為型模式。
適用場景
我們把多個對象聚在一起形成的總體稱之為集合,集合對象是能夠包容一組對象的容器對象。不同的集合其內(nèi)部元素的聚合結(jié)構(gòu)可能不同,而迭代器模式屏蔽了內(nèi)部元素獲取細(xì)節(jié),為外部提供一致的元素訪問行為,解耦了元素迭代與集合對象間的耦合,并且通過提供不同的迭代器,可以為同個集合對象提供不同順序的元素訪問行為,擴(kuò)展了集合對象元素迭代功能,符合開閉原則。迭代器模式適用于以下場景:
1、訪問一個集合對象的內(nèi)容而無需暴露它的內(nèi)部表示;
2、為遍歷不同的集合結(jié)構(gòu)提供一個統(tǒng)一的訪問接口。
代碼實現(xiàn)
//抽象迭代器 public interface Iterator<E> {E next();boolean hasNext(); } //抽象容器 public interface IAggregate<E> {boolean add(E element);boolean remove(E element);Iterator<E> iterator(); } //具體迭代器 public class ConcreteIterator<E> implements Iterator<E> {private List<E> list;private int cursor = 0;public ConcreteIterator(List<E> list) {this.list = list;}public E next() {return this.list.get(this.cursor ++);}public boolean hasNext() {return this.cursor < this.list.size();} } //具體容器 public class ConcreteAggregate<E> implements IAggregate<E> {private List<E> list = new ArrayList<E>();public boolean add(E element) {return this.list.add(element);}public boolean remove(E element) {return this.list.remove(element);}public Iterator<E> iterator() {return new ConcreteIterator<E>(this.list);} } public class Test {public static void main(String[] args) {//來一個容器對象IAggregate<String> aggregate = new ConcreteAggregate<String>();//添加元素aggregate.add("one");aggregate.add("two");aggregate.add("three");//獲取容器對象迭代器Iterator<String> iterator = aggregate.iterator();//遍歷while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}} }優(yōu)缺點
優(yōu)點:
1、多態(tài)迭代:為不同的聚合結(jié)構(gòu)提供一致的遍歷接口,即一個迭代接口可以訪問不同的集合對象;
2、簡化集合對象接口:迭代器模式將集合對象本身應(yīng)該提供的元素迭代接口抽取到了迭代器中,使集合對象無須關(guān)心具體迭代行為;
3、元素迭代功能多樣化:每個集合對象都可以提供一個或多個不同的迭代器,使的同種元素聚合結(jié)構(gòu)可以有不同的迭代行為;
4、解耦迭代與集合:迭代器模式封裝了具體的迭代算法,迭代算法的變化,不會影響到集合對象的架構(gòu)。
缺點:
對于比較簡單的遍歷(像數(shù)組或者有序列表),使用迭代器方式遍歷較為繁瑣。
總結(jié)
以上是生活随笔為你收集整理的迭代器模式(lterator Pattern)简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt 设置背景图片、背景色步骤
- 下一篇: ES6基本的语法(十七) lterato