定義:提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內部細節。
類型:行為類模式
類圖:
1 public static void main(String[] args) { 2 List<Object> list = new ArrayList<Object>(); 3 list.add("a"); 4 list.add("b"); 5 list.add("c"); 6 Aggregate aggregate = new ConcreteAggregate(list); 7 Iterator iterator = aggregate.iterator(); 8 9 while (iterator.hasNext()) { 10 String o = (String) iterator.next(); 11 System.out.println(o); 12 } 13 } 14 15 } 16 17 interface Iterator { 18 19 public Object next(); 20 21 public boolean hasNext(); 22 23 } 24 25 class ConcreteIterator implements Iterator { 26 private List<Object> list; 27 private int cursor = 0;// 當前游標位置 28 29 public ConcreteIterator(List<Object> list) { 30 this.list = list; 31 32 } 33 34 public boolean hasNext() { 35 // TODO Auto-generated method stub 36 return !(cursor == list.size()); 37 } 38 39 public Object next() { 40 // TODO Auto-generated method stub 41 Object obj = null; 42 if (hasNext()) { 43 obj = list.get(cursor++); 44 } 45 return obj; 46 } 47 } 48 49 // 模擬集合接口 增刪 差(遍歷) 50 interface Aggregate { 51 52 public void add(Object obj); 53 54 public void remove(Object obj); 55 56 public Iterator iterator(); 57 58 } 59 60 class ConcreteAggregate implements Aggregate { 61 private List<Object> list; 62 63 public ConcreteAggregate(List<Object> list) { 64 this.list = list; 65 66 } 67 68 public void add(Object obj) { 69 list.add(obj); 70 71 } 72 73 public Iterator iterator() { 74 // TODO Auto-generated method stub 75 return new ConcreteIterator(list); 76 } 77 78 public void remove(Object obj) { 79 list.remove(obj); 80 81 } 82 83 }
迭代器模式的優缺點
迭代器模式的優點有:
- 簡化了遍歷方式,對於對象集合的遍歷,還是比較麻煩的,對於數組或者有序列表,我們尚可以通過游標來取得,但用戶需要在對集合了解很清楚的前提下,自行遍歷對象,但是對於hash表來說,用戶遍歷起來就比較麻煩了。而引入了迭代器方法后,用戶用起來就簡單的多了。
- 可以提供多種遍歷方式,比如說對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種迭代器,用戶用起來只需要得到我們實現好的迭代器,就可以方便的對集合進行遍歷了。
- 封裝性良好,用戶只需要得到迭代器就可以遍歷,而對於遍歷算法則不用去關心。
迭代器模式的缺點:
- 對於比較簡單的遍歷(像數組或者有序列表),使用迭代器方式遍歷較為繁瑣,大家可能都有感覺,像ArrayList,我們寧可願意使用for循環和get方法來遍歷集合。
迭代器模式的適用場景
迭代器模式是與集合共生共死的,一般來說,我們只要實現一個集合,就需要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的迭代器。假如我們要實現一個這樣的新的容器,當然也需要引入迭代器模式,給我們的容器實現一個迭代器。
但是,由於容器與迭代器的關系太密切了,所以大多數語言在實現容器的時候都給提供了迭代器,並且這些語言提供的容器和迭代器在絕大多數情況下就可以滿足我們的需要,所以現在需要我們自己去實踐迭代器模式的場景還是比較少見的,我們只需要使用語言中已有的容器和迭代器就可以了。
參考地址:
http://blog.csdn.net/chenhuade85/article/details/8146992