Iterator模式是行爲模式之一,它把對容器中包含的內部對象的訪問【委讓】給外部類,使用Iterator按順序進行遍歷訪問。設計模式
在程序設計中,常常有這種狀況:須要從大量的數據集合中一個個地取出數據加以處理。Iterator模式就是爲了有效地處理按順序進行遍歷訪問的一種設計模式,簡單地說,Iterator模式提供一種有效的方法,能夠屏蔽彙集對象集合的容器類的實現細節,而能對容器內包含的對象元素按順序進行有效的遍歷訪問。ide
Iterator模式的應用場景能夠概括爲知足如下幾個條件:this
下面是一種比較經典的Iterator模式實現方案,該實現方案基於接口設計原則,設計瞭如下幾個接口或類:spa
優勢設計
定義一個自定義的集合的功能code
1 public interface MyList { 2 MyIterator iterator();//自定義迭代器 3 Object get(int index); 4 int getSize(); 5 void add(Object obj); 6 } 7 public class MyListImpl implements MyList { 8 private Object[] list; 9 private int index; 10 private int size; 11 public MyListImpl() { 12 index = 0; 13 size = 0; 14 list = new Object[100]; 15 } 16 @Override 17 public MyIterator iterator() { 18 return new MyIteratorImpl(this); //將自身的引用傳給了迭代器 19 } 20 @Override 21 public Object get(int index) { 22 if (index > size - 1) throw new RuntimeException("超出邊界了"); 23 return list[index]; 24 } 25 @Override 26 public int getSize() { 27 return this.size; 28 } 29 @Override 30 public void add(Object obj) { 31 list[index++] = obj; 32 size++; 33 } 34 }
迭代器。定義訪問和遍歷元素的接口對象
public interface MyIterator { Object next(); boolean hasNext(); } public class MyIteratorImpl implements MyIterator { private MyList list;//自定義集合 private int index; public MyIteratorImpl(MyList list) { index = 0; this.list = list; } @Override public Object next() { Object obj = list.get(index); index++; return obj; } @Override public boolean hasNext() { return index < list.getSize(); } }
適用性blog
訪問一個聚合對象的內容而無需暴露它的內部表示
支持對聚合對象的多種遍歷
爲遍歷不一樣的聚合結構提供一個統一的接口(即支持多態迭代)接口
public class Test { public static void main(String[] args) { MyList list = new MyListImpl(); list.add("a"); list.add("b"); list.add("c"); //第一種迭代方式 for (int i = 0; i < list.getSize(); i++) { System.out.println(list.get(i)); } //第二種迭代方式 MyIterator it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }
2016-04-21get