1、 概述
提供一種方法來訪問聚合對象,而不用暴露這個對象的內部表示,其別名爲遊標(Cursor)。
2、 模式中的角色
- 抽象迭代器(Iterator):它定義了訪問和遍歷元素的接口,聲明瞭用於遍歷數據元素的方法。
- 具體迭代器(ConcreteIterator):它實現了抽象迭代器接口,完成對聚合對象的遍歷,同時在具體迭代器中通過遊標來記錄在聚合對象中所處的當前位置。
- 抽象聚合類( Aggregate):它用於存儲和管理元素對象,聲明一個createIterator()方法用於創建一個迭代器對象,充當抽象迭代器工廠角色。
- 具體聚合類 (ConcreteAggregate):它實現了在抽象聚合類中聲明的createIterator()方法,該方法返回一個與該具體聚合類對應的具體迭代器ConcreteIterator實例。
3、結構圖
4、代碼實現
//抽象迭代器類
interface Iterator {
public Object next();
public boolean hasNext();
}
class ConcreteIterator implements Iterator{
private List list = new ArrayList();
private int cursor =0;
public ConcreteIterator(List list){
this.list = list;
}
public boolean hasNext() {
if(cursor==list.size()){
return false;
}
return true;
}
public Object next() {
Object obj = null;
if(this.hasNext()){
obj = this.list.get(cursor++);
}
return obj;
}
}
// 抽象聚合類
interface Aggregate {
public void add(Object obj);
public void remove(Object obj);
public Iterator iterator();
}
class ConcreteAggregate implements Aggregate {
private List list = new ArrayList();
public void add(Object obj) {
list.add(obj);
}
public Iterator iterator() {
return new ConcreteIterator(list);
}
public void remove(Object obj) {
list.remove(obj);
}
}
具體調用:
Aggregate ag = new ConcreteAggregate();
ag.add("小明");
ag.add("小紅");
ag.add("小剛");
Iterator it = ag.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
5、使用場景
- 迭代器模式是與集合共生共死的,只要實現一個集合,就需要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實現一個這樣的新的容器,就i需要引入迭代器模式,給我們的容器實現一個迭代器。
- 大多數語言在實現容器的時候都給提供了迭代器,並且這些語言提供的容器和迭代器在絕大多數情況下就可以滿足我們的需要,
參考文章外觀模式和23種設計模式(13):迭代器模式。