迭代器模式(學習筆記19)
阿新 • • 發佈:2021-11-19
原文:http://c.biancheng.net/view/1395.html
定義:提供一個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。
什麼時候用:
- 當需要為聚合物件提供多種遍歷方式時。
- 當需要為遍歷不同的聚合結構提供一個統一的介面時。
- 當訪問一個聚合物件的內容而無須暴露其內部細節的表示時
主要優點:
- 訪問一個聚合物件的內容而無須暴露它的內部表示。
- 遍歷任務交由迭代器完成,這簡化了聚合類。
- 它支援以不同方式遍歷一個聚合,甚至可以自定義迭代器的子類以支援新的遍歷。
- 增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
- 封裝性良好,為遍歷不同的聚合結構提供一個統一的介面。
主要缺點:
- 增加了類的個數,這在一定程度上增加了系統的複雜性。
主要角色:
- 抽象聚合(Aggregate)角色:定義儲存、新增、刪除聚合物件以及建立迭代器物件的介面。
- 具體聚合(ConcreteAggregate)角色:實現抽象聚合類,返回一個具體迭代器的例項。
- 抽象迭代器(Iterator)角色:定義訪問和遍歷聚合元素的介面,通常包含 hasNext()、first()、next() 等方法。
- 具體迭代器(Concretelterator)角色:實現抽象迭代器介面中所定義的方法,完成對聚合物件的遍歷,記錄遍歷的當前位置。
結構圖:
示例程式碼:
package net.biancheng.c.iterator;import java.util.*; public class IteratorPattern { public static void main(String[] args) { Aggregate ag = new ConcreteAggregate(); ag.add("中山大學"); ag.add("華南理工"); ag.add("韶關學院"); System.out.print("聚合的內容有:"); Iterator it = ag.getIterator();while (it.hasNext()) { Object ob = it.next(); System.out.print(ob.toString() + "\t"); } Object ob = it.first(); System.out.println("\nFirst:" + ob.toString()); } } //抽象聚合 interface Aggregate { public void add(Object obj); public void remove(Object obj); public Iterator getIterator(); } //具體聚合 class ConcreteAggregate implements Aggregate { private List<Object> list = new ArrayList<Object>(); public void add(Object obj) { list.add(obj); } public void remove(Object obj) { list.remove(obj); } public Iterator getIterator() { return (new ConcreteIterator(list)); } } //抽象迭代器 interface Iterator { Object first(); Object next(); boolean hasNext(); } //具體迭代器 class ConcreteIterator implements Iterator { private List<Object> list = null; private int index = -1; public ConcreteIterator(List<Object> list) { this.list = list; } public boolean hasNext() { if (index < list.size() - 1) { return true; } else { return false; } } public Object first() { index = 0; Object obj = list.get(index); return obj; } public Object next() { Object obj = null; if (this.hasNext()) { obj = list.get(++index); } return obj; } }