定義
又叫遊標(Cursor)模式,提供一種方法訪問一個容器(container)對象中的各個元素,而又不暴露該對象的內部細節
角色
迭代器角色(Iterator):負責定義訪問和遍歷元素的接口
具體迭代器角色(Concrete Iterator):實現迭代器接口,並要記錄遍歷中的當前位置
容器角色(Container):負責提供創建具體迭代器角色的接口
具體容器角色(Concrete Container):實現創建具體迭代器角色的接口, 這個具體迭代器角色與該容器的結構相關
優點
- 它支持以不同的方式遍歷一個聚合對象
- 在同一個聚合上可以有多個遍歷
- 增加新的聚合類和迭代器類都很方便,無須修改原有代碼
缺點
- 新增一個聚合類,就要相應的實現一個迭代器類,類的個數增多
適用場景
- 訪問一個對象的內容,又不想暴露對象的內部結構
- 對對象進行遍歷
類圖
package com.vapy.behavior.Iterator;
/**
*
* @author vapy 2016年8月27日
*
*/
public interface Aggregat {
public Iterator createIterator();
public void add(Object obj);
}
package com.vapy.behavior.Iterator;
import java.util.Vector;
/**
*
* @author vapy 2016年8月27日
*
*/
public class ConcreteAggregat implements Aggregat {
private Vector<Object> vector = null;
public Vector<Object> getVector() {
return vector;
}
public void setVector(Vector<Object> vector) {
this.vector = vector;
}
public ConcreteAggregat(){
vector = new Vector<Object>();
}
@Override
public void add(Object obj) {
vector.add(obj);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(vector);
}
}
package com.vapy.behavior.Iterator;
/**
*
* @author vapy 2016年8月27日
*
*/
public interface Iterator {
public Object next();
public Object currentItem();
public boolean isDone();
public Object first();
}
package com.vapy.behavior.Iterator;
import java.util.Vector;
/**
*
* @author vapy 2016年8月27日
*
*/
public class ConcreteIterator implements Iterator {
private int cursor = -1;
private Vector<Object> vector = null;
public ConcreteIterator(final Vector<Object> vector){
this.vector = vector;
}
@Override
public Object first() {
return vector.get(0);
}
@Override
public Object next() {
cursor ++;
return vector.get(cursor);
}
@Override
public Object currentItem() {
return vector.get(cursor);
}
@Override
public boolean isDone() {
if(cursor >= this.vector.size() - 1){
return true;
} else {
return false;
}
}
}
package com.vapy.behavior.Iterator;
/**
*
* @author vapy 2016年8月27日
*
*/
public class Client {
public static void main(String[] args) {
final Aggregat agg = new ConcreteAggregat();
agg.add("abc");
agg.add("def");
final Iterator iterator = agg.createIterator();
System.out.println(iterator.first());
while(!iterator.isDone()){
System.out.println(iterator.next());
}
}
}
本文代碼可在github查看:點擊此處