定義:提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內(nèi)部細節(jié)。
類型:行為類模式
類圖:
http://wiki.jikexueyuan.com/project/java-design-pattern/images/iterator-pattern-1.jpg" alt="iterator-pattern" />
如果要問java中使用最多的一種模式,答案不是單例模式,也不是工廠模式,更不是策略模式,而是迭代器模式,先來看一段代碼吧:
public static void print(Collection coll){
Iterator it = coll.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
}
這個方法的作用是循環(huán)打印一個字符串集合,里面就用到了迭代器模式,java語言已經(jīng)完整地實現(xiàn)了迭代器模式,Iterator翻譯成漢語就是迭代器的意思。提到迭代器,首先它是與集合相關(guān)的,集合也叫聚集、容器等,我們可以將集合看成是一個可以包容對象的容器,例如List,Set,Map,甚至數(shù)組都可以叫做集合,而迭代器的作用就是把容器中的對象一個一個地遍歷出來。
迭代器模式的結(jié)構(gòu)
代碼實現(xiàn)
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);
}
}
public class Client {
public static void main(String[] args){
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);
}
}
}
上面的代碼中,Aggregate是容器類接口,大家可以想象一下Collection,List,Set等,Aggregate就是他們的簡化版,容器類接口中主要有三個方法:添加對象方法add、刪除對象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有兩個方法:取得迭代對象方法next,判斷是否迭代完成方法hasNext,大家可以對比java.util.List和java.util.Iterator兩個接口自行思考。
迭代器模式的優(yōu)缺點
迭代器模式的優(yōu)點有:
迭代器模式的缺點:
迭代器模式的適用場景
迭代器模式是與集合共生共死的,一般來說,我們只要實現(xiàn)一個集合,就需要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實現(xiàn)一個這樣的新的容器,當(dāng)然也需要引入迭代器模式,給我們的容器實現(xiàn)一個迭代器。
但是,由于容器與迭代器的關(guān)系太密切了,所以大多數(shù)語言在實現(xiàn)容器的時候都給提供了迭代器,并且這些語言提供的容器和迭代器在絕大多數(shù)情況下就可以滿足我們的需要,所以現(xiàn)在需要我們自己去實踐迭代器模式的場景還是比較少見的,我們只需要使用語言中已有的容器和迭代器就可以了。