描述
????迭代模式是對象的行為模式。迭代模式可以順序訪問集合對象的元素,不需要知道集合對象的底層表示。
簡介

迭代器類圖
????迭代器模式是通過將聚合對象的遍歷行為分離出來,抽象成迭代器類來實現(xiàn)的,其目的是在不暴露聚合對象的內(nèi)部結(jié)構(gòu)的情況下,讓外部代碼透明地訪問聚合的內(nèi)部數(shù)據(jù)?,F(xiàn)在我們來分析其基本結(jié)構(gòu)與實現(xiàn)方法。
角色
- 抽象聚合(Aggregate)角色:定義存儲、添加、刪除聚合對象以及創(chuàng)建迭代器對象的接口。
- 具體聚合(ConcreteAggregate)角色:實現(xiàn)抽象聚合類,返回一個具體迭代器的實例。
- 抽象迭代器(Iterator)角色:定義訪問和遍歷聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
- 具體迭代器(Concretelterator)角色:實現(xiàn)抽象迭代器接口中所定義的方法,完成對聚合對象的遍歷,記錄遍歷的當(dāng)前位置。
優(yōu)缺點
優(yōu)點
- 訪問一個聚合對象的內(nèi)容而無須暴露它的內(nèi)部表示。
- 遍歷任務(wù)交由迭代器完成,這簡化了聚合類。
- 它支持以不同方式遍歷一個聚合,甚至可以自定義迭代器的子類以支持新的遍歷。
- 增加新的聚合類和迭代器類都很方便,無須修改原有代碼。
- 封裝性良好,為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口。
缺點
- 增加了類的個數(shù),這在一定程度上增加了系統(tǒng)的復(fù)雜性。
使用場景
- 訪問一個聚合對象的內(nèi)容而無須暴露它的內(nèi)部表示。
- 需要為聚合對象提供多種遍歷方式。
- 為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口。
示例
/**
* 抽象聚合(Aggregate)角色
*/
public interface Aggregate {
void add(Object obj);
void remove(Object obj);
Iterator getIterator();
}
/**
* 具體聚合(ConcreteAggregate)角色
*/
public class ConcreteAggregate implements Aggregate {
private List<Object> list = new ArrayList<Object>();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator getIterator() {
return (new ConcreteIterator(list));
}
}
/**
* 抽象迭代器(Iterator)角色
*/
public interface Iterator {
Object first();
Object next();
boolean hasNext();
}
/**
* 具體迭代器(Concretelterator)角色
*/
public class ConcreteIterator implements Iterator {
private List<Object> list = null;
private int index = -1;
public ConcreteIterator(List<Object> list) {
this.list = list;
}
@Override
public boolean hasNext() {
if (index < list.size() - 1) {
return true;
} else {
return false;
}
}
@Override
public Object first() {
index = 0;
Object obj = list.get(index);
return obj;
}
@Override
public Object next() {
Object obj = null;
if (this.hasNext()) {
obj = list.get(++index);
}
return obj;
}
}
/**
* 客戶端
*/
public class Client {
public static void main(String[] args) {
Aggregate ag = new ConcreteAggregate();
ag.add("紅");
ag.add("黃");
ag.add("藍");
ag.add("綠");
System.out.print("聚合的內(nèi)容有:");
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());
}
}