天天看點

java 疊代器模式

原文出處:http://blog.csdn.net/zhengzhb/article/details/7610745

定義:提供一種方法通路一個容器對象中各個元素,而又不暴露該對象的内部細節。

類型:行為類模式

類圖:

java 疊代器模式

       如果要問java中使用最多的一種模式,答案不是單例模式,也不是工廠模式,更不是政策模式,而是疊代器模式,先來看一段代碼吧:

[java]   view plain copy

  1. public static void print(Collection coll){  
  2.     Iterator it = coll.iterator();  
  3.     while(it.hasNext()){  
  4.         String str = (String)it.next();  
  5.         System.out.println(str);  
  6.     }  
  7. }  

       這個方法的作用是循環列印一個字元串集合,裡面就用到了疊代器模式,java語言已經完整地實作了疊代器模式,Iterator翻譯成漢語就是疊代器的意思。提到疊代器,首先它是與集合相關的,集合也叫聚集、容器等,我們可以将集合看成是一個可以包容對象的容器,例如List,Set,Map,甚至數組都可以叫做集合,而疊代器的作用就是把容器中的對象一個一個地周遊出來。

疊代器模式的結構

  • 抽象容器:一般是一個接口,提供一個iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具體容器:就是抽象容器的具體實作類,比如List接口的有序清單實作ArrayList,List接口的連結清單實作LinkList,Set接口的哈希清單的實作HashSet等。
  • 抽象疊代器:定義周遊元素所需要的方法,一般來說會有這麼三個方法:取得第一個元素的方法first(),取得下一個元素的方法next(),判斷是否周遊結束的方法isDone()(或者叫hasNext()),移出目前對象的方法remove(),
  • 疊代器實作:實作疊代器接口中定義的方法,完成集合的疊代。

代碼實作

[java]   view plain copy

  1. interface Iterator {  
  2.     public Object next();  
  3.     public boolean hasNext();  
  4. }  
  5. class ConcreteIterator implements Iterator{  
  6.     private List list = new ArrayList();  
  7.     private int cursor =0;  
  8.     public ConcreteIterator(List list){  
  9.         this.list = list;  
  10.     }  
  11.     public boolean hasNext() {  
  12.         if(cursor==list.size()){  
  13.             return false;  
  14.         }  
  15.         return true;  
  16.     }  
  17.     public Object next() {  
  18.         Object obj = null;  
  19.         if(this.hasNext()){  
  20.             obj = this.list.get(cursor++);  
  21.         }  
  22.         return obj;  
  23.     }  
  24. }  
  25. interface Aggregate {  
  26.     public void add(Object obj);  
  27.     public void remove(Object obj);  
  28.     public Iterator iterator();  
  29. }  
  30. class ConcreteAggregate implements Aggregate {  
  31.     private List list = new ArrayList();  
  32.     public void add(Object obj) {  
  33.         list.add(obj);  
  34.     }  
  35.     public Iterator iterator() {  
  36.         return new ConcreteIterator(list);  
  37.     }  
  38.     public void remove(Object obj) {  
  39.         list.remove(obj);  
  40.     }  
  41. }  
  42. public class Client {  
  43.     public static void main(String[] args){  
  44.         Aggregate ag = new ConcreteAggregate();  
  45.         ag.add("小明");  
  46.         ag.add("小紅");  
  47.         ag.add("小剛");  
  48.         Iterator it = ag.iterator();  
  49.         while(it.hasNext()){  
  50.             String str = (String)it.next();  
  51.             System.out.println(str);  
  52.         }  
  53.     }  
  54. }  

       上面的代碼中,Aggregate是容器類接口,大家可以想象一下Collection,List,Set等,Aggregate就是他們的簡化版,容器類接口中主要有三個方法:添加對象方法add、删除對象方法remove、取得疊代器方法iterator。Iterator是疊代器接口,主要有兩個方法:取得疊代對象方法next,判斷是否疊代完成方法hasNext,大家可以對比java.util.List和java.util.Iterator兩個接口自行思考。

疊代器模式的優缺點

        疊代器模式的優點有:

  • 簡化了周遊方式,對于對象集合的周遊,還是比較麻煩的,對于數組或者有序清單,我們尚可以通過遊标來取得,但使用者需要在對集合了解很清楚的前提下,自行周遊對象,但是對于hash表來說,使用者周遊起來就比較麻煩了。而引入了疊代器方法後,使用者用起來就簡單的多了。
  • 可以提供多種周遊方式,比如說對有序清單,我們可以根據需要提供正序周遊,倒序周遊兩種疊代器,使用者用起來隻需要得到我們實作好的疊代器,就可以友善的對集合進行周遊了。
  • 封裝性良好,使用者隻需要得到疊代器就可以周遊,而對于周遊算法則不用去關心。

        疊代器模式的缺點:

  • 對于比較簡單的周遊(像數組或者有序清單),使用疊代器方式周遊較為繁瑣,大家可能都有感覺,像ArrayList,我們甯可願意使用for循環和get方法來周遊集合。

疊代器模式的适用場景

       疊代器模式是與集合共生共死的,一般來說,我們隻要實作一個集合,就需要同時提供這個集合的疊代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的疊代器。假如我們要實作一個這樣的新的容器,當然也需要引入疊代器模式,給我們的容器實作一個疊代器。

       但是,由于容器與疊代器的關系太密切了,是以大多數語言在實作容器的時候都給提供了疊代器,并且這些語言提供的容器和疊代器在絕大多數情況下就可以滿足我們的需要,是以現在需要我們自己去實踐疊代器模式的場景還是比較少見的,我們隻需要使用語言中已有的容器和疊代器就可以了。

繼續閱讀