迭代器這個詞在Java中出現過,即Java中使用Iterator迭代器對集合進行遍歷,但迭代器模式算是一個沒落的模式,基本上沒人會單獨寫一個迭代器,除非是產品性質的開發。java
迭代器模式(Iterator),提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。UML結構圖以下:git
其中,Aggregate是彙集抽象類,負責提供建立具體迭代器角色的接口;Iterator是迭代抽象類,用於定義獲得開始對象、獲得下一個對象、判斷是否到結尾、當前對象等抽象方法,統一接口;ConcreteAggregate是具體彙集類,繼承Aggregate;ConcreteIterator是具體迭代器類,繼承Iterator,實現開始、下一個、是否結尾、當前對象等方法。設計模式
負責提供接口,好比存在一個相似createIterator()這樣的方法,在Java中通常是iterator()方法。ide
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 }
負責定義訪問和遍歷元素的接口,基本上有固定的三個方法,即first()獲取第一個元素、next()訪問下一個元素、hasNext()是否已經遍歷到底部。測試
1 public interface Iterator { 2 3 public Object next(); //遍歷到下一個元素 4 5 public boolean hasNext(); //是否已經遍歷到尾部 6 7 public boolean remove(); //刪除當前指向的元素 8 9 }
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 }
簡單的實現就是經過一個遊標,在一個容器中上下翻滾,遍歷全部它須要查看的元素。this
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 }
下面測試一下,注意引入自定義的Iterator類,而不是Java封裝好的Iterator類。spa
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 }
運行結果以下:設計
這部份內容就再也不贅述了,具體實現與上方代碼沒有太大區別,根據具體應用場景加以改變便可,固然也能夠參考java.util.Iterator的源碼。code
到此,常見的23種設計模式就介紹完了,全部源碼皆已上傳至碼雲,至於擴展的新模式(經常使用23個設計模式以外的設計模式),後續有機會會繼續更新,短期內再也不編寫有關設計模式的內容。對象