介绍
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示
类图说明
类图描述如下:
定义一个迭代器Iterator接口,定义hasNext()和next()方法,然后定义一个具体迭代器实现类来实现定义的两个方法。再定义一个Container容器和容器具体实现类ConcreteContainer,该容器直接关联迭代器,并能返回迭代器实例对象,在该容器定义允许对迭代对象List进行add跟remove。迭代器所有类定义完成,再起一个IteratorPattern来调用看结果。
代码示例
文件结构如下:
代码示例如下:
public interface Iterator {
boolean hasNext();
Object next();
}
public class ConcreteIterator implements Iterator {
private List<Object> list = new ArrayList<>();
private int cursor = 0;
public ConcreteIterator(List<Object> list) {
this.list = list;
}
@Override
public boolean hasNext() {
if(this.cursor == list.size()){
return false;
}
return true;
}
@Override
public Object next() {
Object object = null;
if(hasNext()){
object = list.get(cursor);
cursor++;
}
return object;
}
}
public interface Container {
Iterator iterator();
void add(Object o);
void remove(Object o);
}
public class ConcreteContainer implements Container {
private List<Object> list = new ArrayList<>();
@Override
public Iterator iterator() {
return new ConcreteIterator(this.list);
}
@Override
public void add(Object o) {
this.list.add(o);
}
@Override
public void remove(Object o) {
this.list.remove(o);
}
}
public class IteratorPattern {
public static void main(String[] args) {
ConcreteContainer concreteContainer = new ConcreteContainer();
concreteContainer.add("zhangsan");
concreteContainer.add("lisi");
concreteContainer.add("wangwu");
Iterator iterator = concreteContainer.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
运行结果如下:
应用场景
- 访问一个聚合对象的内容而无须暴露它的内部表示
- 需要为聚合对象提供多种遍历方式
- 为遍历不同的聚合结构提供一个统一的接口
优缺点
优点
- 它支持以不同的方式遍历一个聚合对象
- 迭代器简化了聚合类
- 在同一个聚合上可以有多个遍历
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码
缺点
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性