迭代器模式:又稱爲遊標(cursor)模式,也就是抽象一個迭代器類來分離彙集的遍歷行爲,這樣既能夠作到不暴露彙集的內部結構,又可以讓外部代碼透明地訪問彙集內部的數據。java
角色算法
抽象聚合角色:定義存儲、添加、刪除聚合對象以及建立迭代器對象的接口;設計模式
具體聚合角色:實現抽象聚合類,返回一個具體迭代器的實例;數組
抽象迭代器角色:定義訪問和遍歷聚合元素的接口,一般包含first()、next() 等方法;ide
具體迭代器角色:實現抽象迭代器接口中所定義的方法,完成對聚合對象的遍歷,記錄遍歷的當前位置。學習
類圖this
抽象聚合接口:Aggregate.javaspa
1 package iterator; 2 /** 3 * 抽象聚合接口 4 * @author nick 5 * 6 */ 7 public interface Aggregate { 8 public abstract Iterator createIterator(); //定義抽象方法,返回迭代器類對象 9 }
具體聚合類:ConcreteAggregate.java設計
1 package iterator1; 2 /** 3 * 具體聚合角色 4 * @author nick 5 */ 6 public class ConcreteAggregate implements Aggregate { 7 8 private Object[] objArray = null; //定義對象數組 9 10 public ConcreteAggregate(Object[] objArray){ 11 //傳入聚合對象的具體內容 12 this.objArray = objArray; 13 } 14 15 /** 16 * 實現聚合接口 17 * 調用具體迭代器中的構造方法 18 * 返回具體迭代器迭代器對象 19 */ 20 @Override 21 public Iterator createIterator() { 22 return new ConcreteIterator(this); 23 } 24 25 //獲取彙集的大小 26 public int size(){ 27 return objArray.length; 28 } 29 30 // 獲取彙集內的元素 31 public Object getElement(int index){ 32 if(index < objArray.length){ 33 return objArray[index]; 34 }else{ 35 return null; 36 } 37 } 38 }
抽象迭代器接口:Iterator.java3d
1 package iterator1; 2 /** 3 * 抽象迭代器接口 4 * @author nick 5 */ 6 public interface Iterator { 7 8 void first(); //移動到第一個元素 9 void next(); //移動到下一個元素 10 boolean isLast(); //是不是最後一個元素 11 Object currentItem(); //獲取當前元素 12 }
具體迭代器類:ConcreteIterator.java
1 package iterator1; 2 /** 3 * 具體的迭代器 4 * @author nick 5 */ 6 public class ConcreteIterator implements Iterator { 7 private ConcreteAggregate agg; //持有被迭代的具體的聚合對象 8 private int index = 0; //內部索引,記錄當前迭代到的索引位置 9 private int size = 0; //記錄當前彙集對象的大小 10 11 public ConcreteIterator(ConcreteAggregate agg){ 12 this.agg = agg; 13 this.size = agg.size(); 14 index = 0; 15 } 16 17 @Override//移動到第一個元素 18 public void first() { 19 index = 0; 20 } 21 22 @Override//元素後移 23 public void next() { 24 if(index < size) 25 { 26 index ++; 27 } 28 } 29 30 @Override//判斷是否爲最後一個元素 31 public boolean isLast() { 32 return (index >= size)? true :false; 33 } 34 35 @Override//獲取索引處的元素和 36 public Object currentItem() { 37 return agg.getElement(index); 38 } 39 }
主程序:Application.java
1 package iterator1; 2 /** 3 * 主程序入口 4 * @author nick 5 */ 6 public class Application { 7 public static void main(String[] args) { 8 9 Object[] objArray = {"One","Two","Three","Four","Five","Six"}; 10 Aggregate agg = new ConcreteAggregate(objArray);//建立聚合對象 11 //調用聚合對象中實現的建立迭代器的方法建立迭代器 12 Iterator iter = agg.createIterator(); 13 while(!iter.isLast()){//用迭代器遍歷聚合對象中的元素和 14 System.out.println(iter.currentItem()); 15 iter.next(); 16 } 17 } 18 }
運行結果
優勢1:迭代器模式簡化了彙集的接口。迭代器具有了一個遍歷接口,這樣彙集的接口就沒必要具有遍歷接口。
優勢2: 因爲遍歷算法被封裝在迭代器角色裏面,所以迭代的算法能夠獨立於彙集角色變化。
優勢3:在迭代器模式中,增長新的聚合類和迭代器類都很方便,無須修改原有代碼。
缺點1:迭代器模式將存儲數據和遍歷數據的職責分離,增長新的聚合類須要對應增長新的迭代器類,類的個數成對增長,這在必定程度上增長了系統的複雜性。