一、定義
迭代器模式(Iterator Pattern)目前已經是一個沒落的模式,基本上沒人會單獨寫一個迭代器,除非是產品性質的開發,其定義如下:
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一種方法訪問一個容器對象中各個元素,而又不需暴露該 對象的內部細節。)
迭代器是為容器服務的,那什么是容器呢? 能容納對象的所有類型都可以稱之為容 器,例如Collection集合類型、Set類型等,迭代器模式就是為解決遍歷這些容器中的元素而 誕生的。其通用類圖,如圖所示。
迭代器模式的通用類圖
我們來看看迭代器 模式中的各個角色:
- Iterator抽象迭代器
抽象迭代器負責定義訪問和遍歷元素的接口,而且基本上是有固定的3個方法:first()獲 得第一個元素,next()訪問下一個元素,isDone()是否已經訪問到底部(Java叫做hasNext()方法)。
- ConcreteIterator具體迭代器
具體迭代器角色要實現迭代器接口,完成容器元素的遍歷。
- Aggregate抽象容器
容器角色負責提供創建具體迭代器角色的接口,必然提供一個類似createIterator()這樣的 方法,在Java中一般是iterator()方法。
- Concrete Aggregate具體容器
具體容器實現容器接口定義的方法,創建出容納迭代器的對象。
//抽象迭代器
public interface Iterator {
//遍歷到下一個元素
public Object next();
//是否已經遍歷到尾部
public boolean hasNext();
//刪除當前指向的元素
public boolean remove();
}
//具體迭代器
public class ConcreteIterator implements Iterator {
private Vector vector = new Vector();
//定義當前游標
public int cursor = 0;
@SuppressWarnings("unchecked")
public ConcreteIterator(Vector _vector){
this.vector = _vector;
}
//判斷是否到達尾部
public boolean hasNext() {
if(this.cursor == this.vector.size()){
return false;
}else{
return true;
}
}
//返回下一個元素
public Object next() {
Object result = null;
if(this.hasNext()){
result = this.vector.get(this.cursor++);
}else{
result = null;
}
return result;
}
//刪除當前元素
public boolean remove() {
this.vector.remove(this.cursor);
return true;
}
}
//抽象容器
public interface Aggregate {
//是容器必然有元素的增加
public void add(Object object);
//減少元素
public void remove(Object object);
//由迭代器來遍歷所有的元素
public Iterator iterator();
}
//具體容器
public class ConcreteAggregate implements Aggregate {
//容納對象的容器
private Vector vector = new Vector();
//增加一個元素
public void add(Object object) {
this.vector.add(object);
}
//返回迭代器對象
public Iterator iterator() {
return new ConcreteIterator(this.vector);
}
//刪除一個元素
public void remove(Object object) {
this.remove(object);
}
}
//場景類
public class Client {
public static void main(String[] args) {
//聲明出容器
Aggregate agg = new ConcreteAggregate();
//產生對象數據放進去
agg.add("abc");
agg.add("aaa");
agg.add("1234");
//遍歷一下
Iterator iterator = agg.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
二、最佳實踐
如果你是做Java開發,盡量不要自己寫迭代器模式!省省吧,使用Java提供的Iterator一般就能滿足你的要求了。