設計模式--迭代器模式

設計模式--迭代器模式

一、迭代器模式

  迭代器模式:又稱爲遊標(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:迭代器模式將存儲數據和遍歷數據的職責分離,增長新的聚合類須要對應增長新的迭代器類,類的個數成對增長,這在必定程度上增長了系統的複雜性。

相關文章
相關標籤/搜索