源碼地址 | https://github.com/DingMouRen/DesignPattern |
---|
迭代器模式.png
- Iterator迭代器接口負(fù)責(zé)定義、訪問和遍歷元素的接口
- ConcreteIterator具體迭代器類主要實(shí)現(xiàn)迭代器接口,并記錄遍歷的當(dāng)前位置
- Aggregate容器接口負(fù)責(zé)提供創(chuàng)建具體具體迭代器角色的接口
- ConcreteAggregate具體容器類與具體迭代器角色相關(guān)聯(lián)
定義
迭代器模式提供一種方法順序訪問一個(gè)聚合對象中各個(gè)元素,而又不暴露對象的內(nèi)部表示。
使用場景
遍歷一個(gè)容器對象。
協(xié)作
ConcreteIterator跟蹤容器中的當(dāng)前對象,并能夠計(jì)算出待遍歷的后繼對象。
示例代碼
//迭代器接口
public interface Iterator<T> {
//是否有下一個(gè)元素
boolean hasNext();
//返回當(dāng)前位置的元素,并將位置移到下一位
T next();
}
//具體迭代器類
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> list = new ArrayList<>();
private int cursor = 0;
public ConcreteIterator(List<T> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public T next() {
T obj = null;
if (this.hasNext()) obj = this.list.get(cursor++);
return obj;
}
}
//容器接口
public interface Aggregate<T> {
//添加元素
void add(T obj);
//移除元素
void remove(T obj);
//獲取迭代器對象
Iterator<T> iterator();
}
//具體容器類
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list = new ArrayList<>();
@Override
public void add(T obj) {
list.add(obj);
}
@Override
public void remove(T obj) {
list.remove(obj);
}
@Override
public Iterator<T> iterator() {
return new ConcreteIterator<T>(list);
}
}
總結(jié)
遵循單一原則,弱化容器類與遍歷算法之間的關(guān)系。在客戶端與容器類之間添加一個(gè)迭代器類,可以不暴露容器類內(nèi)部的實(shí)現(xiàn),而得到容器類的元素。