迭代器模式
定义:提供一个对象来顺序访问聚合对象中得一系列数据,而不暴露聚合对象得内部表示
迭代器模式主要结构如下所示:
抽象聚合角色:定义存储,添加,删除聚合元素以及创建迭代器对象得接口
具体聚合角色:实现抽象聚合类,返回一个具体迭代器得实例
抽象迭代器角色:定义访问和遍历聚合元素得接口,通常包含hasNext(),next()等方法
具体迭代器角色:实现抽象迭代器接口中定义得方法,完成对聚合对象得遍历,纪录遍历得当前位置
案例实现
定义一个可以存储学生对象得容器,将遍历该容器得功能交由迭代器实现
代码实现如下:
定义抽象迭代器类
public interface Iterator<T> { boolean hasNext(); T next(); }
定义具体迭代器类
public class IteratorImpl<T> implements Iterator<T>{ //用于存储元素 private final List<T> list; public IteratorImpl(List<T> list){ this.list=list; } private int pos=0; @Override public boolean hasNext() { return pos<list.size(); } @Override public T next() { T element=list.get(pos); pos++; return element; } }
定义抽象聚合类
public interface Aggregate<T> { void add(T element); void remove(T element); //提供获取迭代器的接口 Iterator<T> getIterator(); }
定义具体聚合角色
public class AggregateImpl<T> implements Aggregate<T>{ private final List<T> list; public AggregateImpl(){ list=new ArrayList<>(); } @Override public void add(T element) { list.add(element); } @Override public void remove(T element) { list.remove(element); } @Override public Iterator<T> getIterator() { return new IteratorImpl<>(list); } }
定义学生类用于测试
public class Student { private String name; public Student(String name){ this.name=name; } public String getName(){ return this.name; } public void setName(String name){ this.name=name; } }
定义测试类对迭代器模式进行测试
public class Test { public static void main(String[] args) { AggregateImpl<Student> aggregate=new AggregateImpl<>(); Student student1=new Student("张三"); Student student2=new Student("李四"); Student student3=new Student("王五"); Student student4=new Student("赵六"); aggregate.add(student1); aggregate.add(student2); aggregate.add(student3); aggregate.add(student4); Iterator<Student> iterator= aggregate.getIterator(); while(iterator.hasNext()){ System.out.println(iterator.next().getName()); } } }
迭代器模式优缺点
优点
它支持以不同的方式遍历迭代对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法。我们也可以自己定义迭代器的子类以支持新的遍历方式。
迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计
在迭代器模式中,由于引入了抽象层。增加新的聚合类和迭代器类都很方便,无需修改原有的代码。,满足开闭原则
缺点
增加了类的个数,在一定程度上增加了系统的复杂度
迭代器模式的使用场景
当需要为聚合对象提供多种遍历方式时
当需要为遍历不同的聚合结构提供一个统一的接口时
当访问一个聚合对象的内容而无需暴露其内部细节表示时