源码地址 | https://github.com/DingMouRen/DesignPattern |
---|
- Iterator迭代器接口负责定义、访问和遍历元素的接口
- ConcreteIterator具体迭代器类主要实现迭代器接口,并记录遍历的当前位置
- Aggregate容器接口负责提供创建具体具体迭代器角色的接口
- ConcreteAggregate具体容器类与具体迭代器角色相关联
定义
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象的内部表示。
使用场景
遍历一个容器对象。
协作
ConcreteIterator跟踪容器中的当前对象,并能够计算出待遍历的后继对象。
示例代码
//迭代器接口
public interface Iterator<T> {
//是否有下一个元素
boolean hasNext();
//返回当前位置的元素,并将位置移到下一位
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);
}
}
总结
遵循单一原则,弱化容器类与遍历算法之间的关系。在客户端与容器类之间添加一个迭代器类,可以不暴露容器类内部的实现,而得到容器类的元素。