一遵湖、定義
迭代器模式(Iterator Pattern)目前已經(jīng)是一個(gè)沒(méi)落的模式妻坝,基本上沒(méi)人會(huì)單獨(dú)寫(xiě)一個(gè)迭代器娩梨,除非是產(chǎn)品性質(zhì)的開(kāi)發(fā)肛冶,其定義如下:
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一種方法訪問(wèn)一個(gè)容器對(duì)象中各個(gè)元素,而又不需暴露該 對(duì)象的內(nèi)部細(xì)節(jié)突诬。)
迭代器是為容器服務(wù)的苫拍,那什么是容器呢? 能容納對(duì)象的所有類(lèi)型都可以稱(chēng)之為容 器旺隙,例如Collection集合類(lèi)型绒极、Set類(lèi)型等,迭代器模式就是為解決遍歷這些容器中的元素而 誕生的蔬捷。其通用類(lèi)圖垄提,如圖所示。
我們來(lái)看看迭代器 模式中的各個(gè)角色:
- Iterator抽象迭代器
抽象迭代器負(fù)責(zé)定義訪問(wèn)和遍歷元素的接口周拐,而且基本上是有固定的3個(gè)方法:first()獲 得第一個(gè)元素铡俐,next()訪問(wèn)下一個(gè)元素,isDone()是否已經(jīng)訪問(wèn)到底部(Java叫做hasNext()方法)妥粟。
- ConcreteIterator具體迭代器
具體迭代器角色要實(shí)現(xiàn)迭代器接口审丘,完成容器元素的遍歷。
- Aggregate抽象容器
容器角色負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口勾给,必然提供一個(gè)類(lèi)似createIterator()這樣的 方法滩报,在Java中一般是iterator()方法锅知。
- Concrete Aggregate具體容器
具體容器實(shí)現(xiàn)容器接口定義的方法,創(chuàng)建出容納迭代器的對(duì)象露泊。
//抽象迭代器
public interface Iterator {
//遍歷到下一個(gè)元素
public Object next();
//是否已經(jīng)遍歷到尾部
public boolean hasNext();
//刪除當(dāng)前指向的元素
public boolean remove();
}
//具體迭代器
public class ConcreteIterator implements Iterator {
private Vector vector = new Vector();
//定義當(dāng)前游標(biāo)
public int cursor = 0;
@SuppressWarnings("unchecked")
public ConcreteIterator(Vector _vector){
this.vector = _vector;
}
//判斷是否到達(dá)尾部
public boolean hasNext() {
if(this.cursor == this.vector.size()){
return false;
}else{
return true;
}
}
//返回下一個(gè)元素
public Object next() {
Object result = null;
if(this.hasNext()){
result = this.vector.get(this.cursor++);
}else{
result = null;
}
return result;
}
//刪除當(dāng)前元素
public boolean remove() {
this.vector.remove(this.cursor);
return true;
}
}
//抽象容器
public interface Aggregate {
//是容器必然有元素的增加
public void add(Object object);
//減少元素
public void remove(Object object);
//由迭代器來(lái)遍歷所有的元素
public Iterator iterator();
}
//具體容器
public class ConcreteAggregate implements Aggregate {
//容納對(duì)象的容器
private Vector vector = new Vector();
//增加一個(gè)元素
public void add(Object object) {
this.vector.add(object);
}
//返回迭代器對(duì)象
public Iterator iterator() {
return new ConcreteIterator(this.vector);
}
//刪除一個(gè)元素
public void remove(Object object) {
this.remove(object);
}
}
//場(chǎng)景類(lèi)
public class Client {
public static void main(String[] args) {
//聲明出容器
Aggregate agg = new ConcreteAggregate();
//產(chǎn)生對(duì)象數(shù)據(jù)放進(jìn)去
agg.add("abc");
agg.add("aaa");
agg.add("1234");
//遍歷一下
Iterator iterator = agg.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
二喉镰、最佳實(shí)踐
如果你是做Java開(kāi)發(fā),盡量不要自己寫(xiě)迭代器模式惭笑!省省吧侣姆,使用Java提供的Iterator一般就能滿(mǎn)足你的要求了。