迭代器模式(Iterator),其含義是提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內部表示。這一模式的關鍵思想是將對列表的訪問和遍歷從列表對象中分離出來並放入一個迭代器對象中。迭代器類定義了一個訪問該列表元素的接口。能夠理解爲咱們常見的java集合中的Iterator接口,很是相似。
其適用性:java
訪問一個聚合對象的內容而無需暴露它的內部表示,ide
支持對聚合對象的多種遍歷,測試
爲遍歷不一樣的聚合結構提供一個統一的接口(即,支持多態迭代)。 this
其結構圖:spa
迭代器和列表式耦合在一塊兒的,並且客戶對象必須知道遍歷的是一個列表而不是其餘聚合結構,咱們在使用時其實有兩個迭代器,一個是外部迭代器,另外一個是內部迭代器,外部迭代器是由客戶端主動推動遍歷的步伐,顯示地向迭代器請求下一個元素,而內部迭代器客戶只需向其提交一個代執行的操做,而迭代器將對聚合中的每個元素實施該操做。code
在實現時, Iterator類有一個屬性是Aggregate的實例,該方式是對象適配器的運用,Iterator的相關操做都是底層經過Aggregate的實例來實現的。如:對象
package
org.designpattern.behavioral.iterator;
public
abstract
class Iterator {
protected Aggregate aggregate;
protected
int index;
public Aggregate getAggregate() {
return aggregate;
}
public
void setAggregate(Aggregate aggregate) {
this.aggregate = aggregate;
}
public
abstract
void first();
public
abstract
void next();
public
abstract
void last();
public
abstract
boolean isDone();
public
abstract Object currentItem();
}
Aggregate定義接口操做(在此略去),由本身的實現類實現:blog
package
org.designpattern.behavioral.iterator;
import java.util.ArrayList;
public
class ConcreteAggregate
extends Aggregate{
private Object[] objs;
public ConcreteAggregate(){
this.objs =
new Object[32];
this.size = 0;
}
@Override
public Iterator createIterator() {
Iterator iterator =
new ConcreteIterator();
iterator.setAggregate(
this);
return iterator;
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public Object getItem(
int index) {
return
this.objs[index];
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public
int getSize() {
return
this.size ;
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public
void addObject(Object obj) {
this.objs[
this.size] = obj;
this.size++;
//
To change body of implemented methods use File | Settings | File Templates.
}
}
Iterator的子類操做均是經過Aggregate的實現類來實現:接口
package
org.designpattern.behavioral.iterator;
public
class ConcreteIterator
extends Iterator {
public ConcreteIterator(){
this.index = 0;
}
@Override
public Object currentItem() {
return
this.getAggregate().getItem(
this.index);
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public
void first() {
this.index = 0;
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public
void next() {
if(
this.index <
this.getAggregate().getSize()){
this.index ++;
}
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public
void last() {
this.getAggregate().getSize();
//
To change body of implemented methods use File | Settings | File Templates.
}
@Override
public
boolean isDone() {
return
this.index ==
this.getAggregate().getSize();
//
To change body of implemented methods use File | Settings | File Templates.
}
} get
客戶端測試類就能夠直接像使用普通的迭代器同樣使用了。由此看迭代器將具體的集合類和迭代類分離開來,使用迭代器和具體集合類的複用性更佳,且外界代碼使用時能夠使用迭代器遍歷集合,從而無需關心集合的內部細節。