迭代器模式(iterator),又稱爲遊標(cursor)模式,是一種行爲性模型,行爲型模式關注的是系統中對象之間的相互交互,解決系統在運行時對象之間的相互通信和協作,進一步明確對象的職責。相比來說,創建型模式關注對象的創建過程,結構型模式關注對象和類的組合關係。
模式的職責
提供一種可以遍歷聚合對象的方式。
模式的結構
聚合對象:存儲數據
迭代器:遍歷數據
模式的實現
public interface MyIterator {
void first();//將遊標指向第一個元素()
void next();//將遊標指向下一個元素
Object getCurrentObj();
boolean hasNext();//判斷是否有下一個元素
//這兩個可以有也可以沒有
boolean isfirst();//判斷是否是第一個元素
boolean isLast();//判斷是否是最後一個元素
}
public class ConcreteMyaggregate {
//承載需要迭代的容器
private List<Object> list = new ArrayList<Object>();
public ConcreteMyaggregate(List<Object> list){
super();
this.list =list;
}
public void addObject(Object obj){
list.add(obj);
}
public void removeObject(Object obj){
list.remove(obj);
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
//外部獲得迭代器的類的方法
public MyIterator createIterator(){
return new ConcreteItertor();
}
//使用內部類定義迭代器,可以直接使用外部類的屬性
private class ConcreteItertor implements MyIterator{
//迭代器的遊標
private int cursor;
public void first() {
cursor = 0;
}
//迭代器的真正實現
public Object getCurrentObj() {
return list.get(cursor);
}
public boolean hasNext() {
if(cursor<list.size()){
return true;
}
return false;
}
public boolean isLast() {
return cursor == (list.size()-1)?true:false;
}
public boolean isfirst() {
return cursor == 0?true:false;
}
public void next() {
if(cursor<list.size())
cursor++;
}
}
}
//客戶端調用
public class Client {
public static void main(String[] args) {
//創建容器,往容器中放入對象
ConcreteMyaggregate cma = new ConcreteMyaggregate(null);
cma.addObject("a");
cma.addObject("b");
cma.addObject("c");
//創建迭代器,取出對象
MyIterator iter = cma.createIterator();
//只要還有對象,就取出對象,並把遊標往下一個
while(iter.hasNext()){
System.out.println(iter.getCurrentObj());
iter.next();
}
}
}
其他說明
這個實現案例是用正向遍歷的迭代器,其實也可以實現逆向遍歷的迭代器(就是每次都把遊標向前一位的那種)。
JDK內置的迭代器(List/Set)裏面也是用的這種方式。