一、模式介紹
迭代器模式為我們提供一種按照順序訪問集合容器中對象元素的方法,而無需暴露集合內(nèi)部細(xì)節(jié)表示。無論是什么類型的容器,迭代器模式都能為其提供一致的遍歷行為,不用關(guān)心容器內(nèi)部元素的組成結(jié)構(gòu)。
通常迭代器模式會包含如下四種角色:
- 抽象迭代器,定義訪問和遍歷元素的行為;
- 具體迭代器,實(shí)現(xiàn)具體的遍歷元素的行為邏輯;
- 抽象容器,定義元素的增刪行為,還有獲取迭代器的行為;
- 具體容器,實(shí)現(xiàn)容器的具體增刪行為,和獲取迭代器的具體邏輯;
通用實(shí)現(xiàn)代碼如下:
public interface Iterator<E> {
E next();
boolean hasNext();
}
public class ConcreteIterator<E> implements Iterator {
private List<E> list;
private int cursor = 0;
public ConcreteIterator(List<E> list){
this.list = list;
}
@Override
public Object next() {
return list.get(cursor++);
}
@Override
public boolean hasNext() {
return cursor < list.size();
}
}
public interface Container<E> {
boolean add(E element);
boolean remove(E element);
Iterator<E> iterator();
}
public class ConcreteContainer<E> implements Container<E>{
private List<E> list = new ArrayList<>();
@Override
public boolean add(E element) {
return list.add(element);
}
@Override
public boolean remove(E element) {
return list.remove(element);
}
@Override
public Iterator<E> iterator() {
return new ConcreteIterator<E>(list);
}
}
@Slf4j
public class Main {
public static void main(String[] args) {
Container<String> strContainer = new ConcreteContainer<String>();
strContainer.add("jack");
strContainer.add("tom");
strContainer.add("lily");
Iterator<String> strIterator = strContainer.iterator();
while(strIterator.hasNext()){
log.info("{}", strIterator.next());
}
}
}
可以看到,無論是什么類型的容器,其底層實(shí)現(xiàn)還是需要依靠JDK提供的集合框架類,但是我們可以進(jìn)行封裝,使其具有業(yè)務(wù)特點(diǎn),同時(shí)在其內(nèi)部實(shí)現(xiàn)迭代器的獲取方式,如此無論什么類型的容器,我們只要這一個迭代器就夠了。
二、使用案例
- JDK中的Iterator和ArrayList;
三、模式總結(jié)
3.1 優(yōu)點(diǎn)
- 為不同的容器提供了一致的遍歷行為,符合代碼復(fù)用原則;
- 將容器和迭代行為進(jìn)行分離,集合對象無需關(guān)心具體的迭代行為;
- 每個容器可以擁有多個迭代器,來實(shí)現(xiàn)不同需要的迭代行為;
3.2 缺點(diǎn)
- 日常開發(fā)中,使用JDK提供的集合和迭代器即可,一般很少自己實(shí)現(xiàn)迭代器模式;