迭代器模式也稱遊標模式,在絕大多數編程語言中,迭代器已經成爲一個基礎的類庫,直接用來遍歷集合對象。關鍵思想是將訪問和遍歷的職責從集合對象中分離出來,放入標準的協議對象中。算法
它提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。編程
模板代碼markdown
//1.抽象迭代器
public interface Iterator{
//遍歷到下一個元素
public Object next();
//是否已經遍歷到尾部
public boolean hasNext();
//刪除當前指向的元素
public boolean remove();
}
//2.具體迭代器
public class ConcreteIterator implements Iterator{
private Vector vector = new Vector();
//定義當前遊標
public int cursor = 0;
public ConcreteIterator(Vector _vector){
this.vector = _vector;
}
//判斷是否到達尾部
public boolean hasNext(){
if(this.cursor == this.vector.size()){
return false;
}else{
return true;
}
}
//返回下一個元素
public Object next(){
Object result = null;
if(this.hasNext()){
result = this.vector.get(this.cursor++);
}else{
result = null;
}
return result;
}
//刪除當前元素
public boolean remove(){
this.vector.remove(this.cursor);
return true;
}
}
//3.抽象容器
public interface Aggregate{
//是容器必然有元素的增長
public void add(Object object);
//減小元素
public void remove(Object object);
//由迭代器來遍歷全部的元素
public Iterator iterator();
}
//4.具體容器
public class ConcreteAggregate implements Aggregate{
//容納對象的容器
private Vector vector = new Vector();
//增長一個元素
public void add(Object object){
this.vector.add(object);
}
//返回迭代器對象
public Iterator iterator(){
return new ConcreteIterator(this.vector);
}
//刪除元素
public void remove(Object object){
this.vector.remvoe(object);
}
}
//5.場景類
public class Client{
public static void main(String[] args){
//容器
Aggregate agg = new ConcreteAggregate();
//添加數據
agg.add("abc");
agg.add("aaa");
agg.add("1234");
//遍歷
Iterator iterator = agg.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
複製代碼
對客戶端隱藏其遍歷算法複雜性時編程語言
須要簡化重複的循環遍歷邏輯時this
知足單一職責原則,將遍歷算法代碼統一抽取封裝爲獨立的類,職責僅僅是遍歷數據spa
知足開閉原則,當須要對新的對象集合進行擴展時,只須要新增具體的對象迭代器和具體的集合類就能夠code
避免了直接使用for
循環的重複代碼問題orm
增長了子類數量對象
增長了系統複雜性rem