簡說設計模式——迭代器模式


一、什么是迭代器模式

  迭代器這個詞在Java中出現過,即Java中使用Iterator迭代器對集合進行遍歷,但迭代器模式算是一個沒落的模式,基本上沒人會單獨寫一個迭代器,除非是產品性質的開發。

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

  其中,Aggregate是聚集抽象類,負責提供創建具體迭代器角色的接口;Iterator是迭代抽象類,用於定義得到開始對象、得到下一個對象、判斷是否到結尾、當前對象等抽象方法,統一接口;ConcreteAggregate是具體聚集類,繼承Aggregate;ConcreteIterator是具體迭代器類,繼承Iterator,實現開始、下一個、是否結尾、當前對象等方法。

  1. 抽象容器

  負責提供接口,比如存在一個類似createIterator()這樣的方法,在Java中一般是iterator()方法。

1 public interface Aggregate {
2     
3     public void add(Object object);
4     
5     public void remove(Object object);
6     
7     public Iterator iterator();
8 
9 }

  2. 抽象迭代器

  負責定義訪問和遍歷元素的接口,基本上有固定的三個方法,即first()獲取第一個元素、next()訪問下一個元素、hasNext()是否已經遍歷到底部。

1 public interface Iterator {
2     
3     public Object next();    //遍歷到下一個元素
4     
5     public boolean hasNext();    //是否已經遍歷到尾部
6     
7     public boolean remove();    //刪除當前指向的元素
8 
9 }

  3. 具體容器

 1 public class ConcreteAggregate implements Aggregate {
 2     
 3     private Vector vector = new Vector();
 4 
 5     @Override
 6     public void add(Object object) {
 7         this.vector.add(object);
 8     }
 9 
10     public void remove(Object object) {
11         this.remove(object);
12     }
13 
14     @Override
15     public Iterator iterator() {
16         return new ConcreteIterator(this.vector);
17     }
18     
19 }

  4. 具體迭代器

  簡單的實現就是通過一個游標,在一個容器中上下翻滾,遍歷所有它需要查看的元素。

 1 public class ConcreteIterator implements Iterator {
 2     
 3     private Vector vector = new Vector();
 4     public int cursor = 0;    //定義當前游標
 5     
 6     public ConcreteIterator(Vector vector) {
 7         this.vector = vector;
 8     }
 9 
10     @Override
11     public Object next() {
12         Object result = null;
13         
14         if (this.hasNext()) {
15             result = this.vector.get(this.cursor ++);
16         } else {
17             result = null;
18         }
19         
20         return result;
21     }
22 
23     @Override
24     public boolean hasNext() {
25         if (this.cursor == this.vector.size()) {
26             return false;
27         }
28         
29         return true;
30     }
31 
32     @Override
33     public boolean remove() {
34         this.vector.remove(this.cursor);
35         
36         return true;
37     }
38 
39 }

  5. Client客戶端

  下面測試一下,注意引入自定義的Iterator類,而不是Java封裝好的Iterator類。

 1 public class Client {
 2     
 3     public static void main(String[] args) {
 4         Aggregate aggregate = new ConcreteAggregate();
 5         aggregate.add("abc");
 6         aggregate.add("aaa");
 7         aggregate.add("1234");
 8         
 9         //遍歷
10         Iterator iterator = aggregate.iterator();
11         while (iterator.hasNext()) {
12             System.out.println(iterator.next());
13         }
14     }
15 
16 }

  運行結果如下:

  

二、迭代器模式的應用

  1. 何時使用

  • 遍歷一個聚合對象時

  2. 方法

  • 把在元素間游走的責任交給迭代器,而不是聚合對象

  3. 優點

  • 支持以不同的方式遍歷一個聚合對象
  • 迭代器簡化了聚合類
  • 在同一個聚合上可以有多個遍歷
  • 增加新的聚合類和迭代器類都很方便,無需修改原有代碼

  4. 缺點

  • 增加了系統的復雜性。因為迭代器模式將存儲數據和遍歷數據的職責分離,增加了新的聚合類需要對應增加新的迭代器類,增加了系統的復雜性。

  5. 使用場景 

  • 訪問一個聚合對象的內容無需暴露它的內部表示時
  • 需要為聚合對象提供多種便利方式時
  • 為遍歷不同的聚合結構提供一個統一的接口

  6. 應用實例

  • Java中的Iterator迭代器
  • foreach遍歷

三、迭代器模式的實現

  這部分內容就不再贅述了,具體實現與上方代碼沒有太大區別,根據具體應用場景加以改變即可,當然也可以參考java.util.Iterator的源碼。

 


  到此,常見的23種設計模式就介紹完了,所有源碼皆已上傳至碼雲,至於擴展的新模式(常用23個設計模式之外的設計模式),后續有機會會繼續更新,短時間內不再編寫有關設計模式的內容。

 

  源碼地址:https://gitee.com/adamjiangwh/GoF 


免責聲明!

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



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