1. 程式人生 > 其它 >迭代器模式(學習筆記19)

迭代器模式(學習筆記19)

原文:http://c.biancheng.net/view/1395.html

定義:提供一個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。

什麼時候用:

  1. 當需要為聚合物件提供多種遍歷方式時。
  2. 當需要為遍歷不同的聚合結構提供一個統一的介面時。
  3. 當訪問一個聚合物件的內容而無須暴露其內部細節的表示時

主要優點:

  1. 訪問一個聚合物件的內容而無須暴露它的內部表示。
  2. 遍歷任務交由迭代器完成,這簡化了聚合類。
  3. 它支援以不同方式遍歷一個聚合,甚至可以自定義迭代器的子類以支援新的遍歷。
  4. 增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
  5. 封裝性良好,為遍歷不同的聚合結構提供一個統一的介面。


主要缺點:

  1. 增加了類的個數,這在一定程度上增加了系統的複雜性。

主要角色:

  1. 抽象聚合(Aggregate)角色:定義儲存、新增、刪除聚合物件以及建立迭代器物件的介面。
  2. 具體聚合(ConcreteAggregate)角色:實現抽象聚合類,返回一個具體迭代器的例項。
  3. 抽象迭代器(Iterator)角色:定義訪問和遍歷聚合元素的介面,通常包含 hasNext()、first()、next() 等方法。
  4. 具體迭代器(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; } }