【迭代器模式】—— 資料的遍歷
阿新 • • 發佈:2018-12-10
迭代器模式,提供了介面訪問容器中的元素,而不需要暴露容器的內部表現。
一、關鍵點
1)先看下這個模式點關鍵點:
遍歷:該模式的最大特點就是提供了遍歷內部集合資料的介面,從而達到訪問集合資料的目的;
解耦:該模式以迭代器的身份去實現遍歷集合物件的目的,從而不需要暴露內部的表示,達到了解耦的目的。
2)我們再看下它的類圖關係:
Iterator:迭代器介面;
ConcreteIterator:迭代器具體的實現介面,實現對集合資料的訪問;
Aggregate:容器集合的功能介面;
ConcreteAggregate:具體的容器類,通過相應的介面對外提供資料的訪問。
二、實現
2.1 Iterator 迭代器抽象介面
public interface Iterator<T> {
boolean hasNext();
T next();
}
2.2 ConcreteIterator 具體迭代器類
public class ConcreteIterator<T> implements Iterator<T> { private int mCursor; private List<T> mList = new ArrayList<>(); public ConcreteIterator(List<T> list) { mList = list; } @Override public boolean hasNext() { return mCursor != mList.size(); } @Override public T next() { T obj = null; if (hasNext()) { obj = mList.get(mCursor++); } return obj; } }
2.3 Aggregate抽象容器介面
public interface Aggregate<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
2.4 ConcreteAggregate具體的容器實現物件
public class ConcreteAggregate<T> implements Aggregate<T> { private List<T> mList = new ArrayList<>(); @Override public void add(T obj) { mList.add(obj); } @Override public void remove(T obj) { mList.remove(obj); } @Override public Iterator<T> iterator() { return new ConcreteIterator<>(mList); } }
2.4 Client客戶端類
public class Client {
public static void main(String[] args) {
Aggregate<String> containers = new ConcreteAggregate<>();
containers.add("hello");
containers.add("iterator");
Iterator<String> iterator = containers.iterator();
while (iterator.hasNext()) {
/* print iterator iterator.next() */
}
}
}
三、小結
3.1 訪問方式 該模式提供了種不需要知道內部表示的訪問方式,從而方便客戶端方便直接地訪問資料;
3.2 拓展與複用 該模式可以非常好地使用在一型別的集合物件上,並能根據需要拓展介面能力,靈活地變化。