package Iterator; import java.util.*; /**實現建立具體迭代器角色的接口, 這個具體迭代器角色與該容器的結構相關**/ public class ConcreteContainer implements Container { private Vector vector = null; public Vector getVector() { return vector; } public void setVector(Vector vector) { this.vector = vector; } @Override public Iterator createIterator() { // TODO Auto-generated method stub return new ConcreteIterator(vector); } public ConcreteContainer() { vector = new Vector(); vector.add("vector 1"); vector.add("vector 2"); vector.add("vector 3"); } }
package Iterator; /**實現迭代器接口,並要記錄遍歷中的當前位置**/ import java.util.*; public class ConcreteIterator implements Iterator { private int currentIndex = 0; private Vector vector = null; public ConcreteIterator(final Vector vector) { this.vector = vector; } @Override public Object first() { // TODO Auto-generated method stub currentIndex = 0; return vector.get(currentIndex); } @Override public Object next() { // TODO Auto-generated method stub currentIndex++; return vector.get(currentIndex); } @Override public Object currenItem() { // TODO Auto-generated method stub return vector.get(currentIndex); } @Override public boolean isDone() { // TODO Auto-generated method stub if (currentIndex >= this.vector.size() - 1) { return true; } else { return false; } } @Override public int count() { // TODO Auto-generated method stub return 0; } }
package Iterator; /**負責提供建立具體迭代器角色的接口**/ public interface Container { public Iterator createIterator(); }
package Iterator; /**負責定義訪問和遍歷元素的接口**/ public interface Iterator { public Object first(); public Object next(); public Object currenItem(); public boolean isDone(); public int count(); }
package JTest; import static org.junit.Assert.*; import org.junit.Test; import Iterator.ConcreteContainer; import Iterator.Container; import Iterator.Iterator; public class IteratorTest { @Test public void IteratorTest() { final Container container = new ConcreteContainer(); final Iterator iterator = container.createIterator(); System.out.println(iterator.first()); while (!iterator.isDone()) { System.out.println(iterator.next()); } } }
http://www.cnblogs.com/itTeacher/archive/2012/12/03/2799534.html
迭代器模式有叫作遊標(Cursor)模式。GOF給出的定義:提供一種方法訪問一個容器(container)對象中的各個元素,而又不暴露該對象的內部細節。html
迭代器模式由如下角色組成:
迭代器角色(Iterator): 負責定義訪問和遍歷元素的接口。
具體迭代器角色(Concrete Iterator):實現迭代器接口,並要記錄遍歷中的當前位置。
容器角色(Container): 負責提供建立具體迭代器角色的接口。
具體容器角色(Concrete Container):實現建立具體迭代器角色的接口, 這個具體迭代器角色與該容器的結構相關。
迭代器模式的優缺點
迭代器模式的優勢有:
簡化了遍歷方式,對於對象集合的遍歷,仍是比較麻煩的,對於數組或者有序列表,咱們尚能夠經過遊標來取得,但用戶須要在對集合瞭解很清楚的前提下,自行遍歷對象,
可是對於hash表來講,用戶遍歷起來就比較麻煩了。而引入了迭代器方法後,用戶用起來就簡單的多了。
能夠提供多種遍歷方式,好比說對有序列表,咱們能夠根據須要提供正序遍歷,倒序遍歷兩種迭代器,用戶用起來只須要獲得咱們實現好的迭代器,就能夠方便的對集合進行遍歷了。
封裝性良好,用戶只須要獲得迭代器就能夠遍歷,而對於遍歷算法則不用去關心。java
迭代器模式的缺點:
對於比較簡單的遍歷(像數組或者有序列表),使用迭代器方式遍歷較爲繁瑣,你們可能都有感受,像ArrayList,咱們寧肯願意使用for循環和get方法來遍歷集合。
迭代器模式的適用場景
迭代器模式是與集合共生共死的,通常來講,咱們只要實現一個集合,就須要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有本身的迭代器。假如咱們要實現一個這樣的新的容器,固然也須要引入迭代器模式,給咱們的容器實現一個迭代器。
可是,因爲容器與迭代器的關係太密切了,因此大多數語言在實現容器的時候都給提供了迭代器,而且這些語言提供的容器和迭代器在絕大多數狀況下就能夠知足咱們的須要,因此如今須要咱們本身去實踐迭代器模式的場景仍是比較少見的,咱們只須要使用語言中已有的容器和迭代器就能夠了。算法