迭代器模式(Iterator)


一、迭代器模式介紹

迭代器模式:提供一種方法順序的訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。

一般情況,我們自己開發時很少自定義迭代器,因為java本身已經把迭代器做到內部中了(比如:常用的list和set中都內置了迭代器)。

當然,如果真有這種需求需要我們自定義迭代器的話,可以參考jdk的迭代器實現方式來實現自己的迭代器。

迭代器是可以從前往后,或者從后往前遍歷的。

為遍歷不同聚集結構提供如:開始,下一個,是否有下一個,是否結束,當前哪一個等等的一個統一接口。

迭代器模式UML圖:

聚集類:Aggregate(抽象類)和ConcreteAggregate(具體聚集類)表示聚集類,是用來存儲迭代器的數據。

在Aggregate(抽象類)中有一個CreateIterator方法,用來獲取迭代器

迭代器:迭代器用來為聚集類提供服務,提供了一系列訪問聚集類對象元素的方法。

 

二、模擬迭代器的實現

首先定義一個迭代器的抽象,這里使用接口定義

1
2
3
4
5
6
7
8
9
10
//迭代器接口
public  interface  MyIterator {
     void  first(); //將游標指向第一個元素
     void  next(); //將游標指向下一個元素
     boolean  hasNext(); //判斷是否有下一個元素
     
     boolean  isFirst(); //判斷是否是第一個元素
     boolean  isLast(); //判斷是否是最后一個元素
     Object getCurrentObj(); //獲取當前對象
}

然后自定一個一個聚集類,這里直接使用一個class來定義了。在聚集類內部,使用內部類的方式來定義迭代器的具體實現。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import  java.util.ArrayList;
import  java.util.List;
 
//自定義聚集類
public  class  ConcreteMyAggregate {
     private  List<Object> list =  new  ArrayList<>();
     public  void  addObject(Object obj){
         this .list.add(obj);
     }
     public  void  removeObject(Object obj){
         this .list.remove(obj);
     }
     public  List<Object> getList() {
         return  list;
     }
     public  void  setList(List<Object> list) {
         this .list = list;
     }
     //獲得迭代器
     public  MyIterator createIterator(){
         return  new  ConcreteIterator();
     }
     
     //使用內部類來定義迭代器,好處就是可以直接使用外部類的屬性
     private  class  ConcreteIterator  implements  MyIterator{
         private  int  cursor; //定義一個迭代器游標
         @Override
         public  void  first() {
             cursor =  0 ;
         }
         @Override
         public  void  next() {
             if  (cursor<list.size()) {
                 cursor++;
             }
         }
         @Override
         public  boolean  hasNext() {
             //如果游標<list的大小,則說明還有下一個
             if  (cursor<list.size()) {
                 return  true ;
             }
             return  false ;
         }
         @Override
         public  boolean  isFirst() {
             return  cursor== 0 ? true : false ;
         }
         @Override
         public  boolean  isLast() {
             //判斷游標是否是容器的最后一個
             return  cursor==(list.size()- 1 )? true : false ;
         }
         @Override
         public  Object getCurrentObj() {
             return  list.get(cursor); //獲取當前游標指向的元素
         }
     }
     
}

客戶端測試代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  void  main(String[] args) {
     ConcreteMyAggregate cma =  new  ConcreteMyAggregate();
     cma.addObject( "111" );
     cma.addObject( "222" );
     cma.addObject( "333" );
     cma.addObject( "444" );
        
     MyIterator iterator = cma.createIterator();
     cma.removeObject( "111" ); //如果刪除一個元素的話,迭代的時候也同樣會被刪除
     while  (iterator.hasNext()) {
         System.out.println(iterator.getCurrentObj()); //獲取當前對象
         iterator.next(); //將游標向下移
     }
}

測試結果如下:

    222

    333

    444

 

 



Java23種設計模式學習筆記【目錄總貼】

參考資料:

  大話設計模式(帶目錄完整版).pdf

  HEAD_FIRST設計模式(中文版).pdf

  尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM