描述
????迭代模式是對(duì)象的行為模式裆蒸。迭代模式可以順序訪問(wèn)集合對(duì)象的元素,不需要知道集合對(duì)象的底層表示。
簡(jiǎn)介
????迭代器模式是通過(guò)將聚合對(duì)象的遍歷行為分離出來(lái),抽象成迭代器類(lèi)來(lái)實(shí)現(xiàn)的斋竞,其目的是在不暴露聚合對(duì)象的內(nèi)部結(jié)構(gòu)的情況下,讓外部代碼透明地訪問(wèn)聚合的內(nèi)部數(shù)據(jù)⊥貉常現(xiàn)在我們來(lái)分析其基本結(jié)構(gòu)與實(shí)現(xiàn)方法坝初。
角色
- 抽象聚合(Aggregate)角色:定義存儲(chǔ)、添加钾军、刪除聚合對(duì)象以及創(chuàng)建迭代器對(duì)象的接口鳄袍。
- 具體聚合(ConcreteAggregate)角色:實(shí)現(xiàn)抽象聚合類(lèi),返回一個(gè)具體迭代器的實(shí)例吏恭。
- 抽象迭代器(Iterator)角色:定義訪問(wèn)和遍歷聚合元素的接口拗小,通常包含 hasNext()、first()砸泛、next() 等方法十籍。
- 具體迭代器(Concretelterator)角色:實(shí)現(xiàn)抽象迭代器接口中所定義的方法,完成對(duì)聚合對(duì)象的遍歷唇礁,記錄遍歷的當(dāng)前位置。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露它的內(nèi)部表示惨篱。
- 遍歷任務(wù)交由迭代器完成盏筐,這簡(jiǎn)化了聚合類(lèi)。
- 它支持以不同方式遍歷一個(gè)聚合砸讳,甚至可以自定義迭代器的子類(lèi)以支持新的遍歷琢融。
- 增加新的聚合類(lèi)和迭代器類(lèi)都很方便,無(wú)須修改原有代碼簿寂。
- 封裝性良好漾抬,為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。
缺點(diǎn)
- 增加了類(lèi)的個(gè)數(shù)常遂,這在一定程度上增加了系統(tǒng)的復(fù)雜性纳令。
使用場(chǎng)景
- 訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露它的內(nèi)部表示。
- 需要為聚合對(duì)象提供多種遍歷方式克胳。
- 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(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("藍(lán)");
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());
}
}