定义:
提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
选代器模式主要包含以下角色:
(1)抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建选代器对象的接口。
(2)具体聚合(concreteAggregate)角色:实现抽象聚合类,返回一个具体选代器的实例
(3)抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。
(4)具体选代器(concretelterator)角色:实现抽象选代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置
- /**
- * 抽象聚合对象接口
- */
- public interface StudentAggregate {
-
- // 添加学生功能
- void addStudent(Student student);
-
- // 删除学生功能
- void removeStudent(Student student);
-
- // 获取迭代器对象功能
- StudentIterator getStudentIterator();
- }
- /**
- * 具体聚合角色
- */
- public class StudentAggregateImpl implements StudentAggregate {
-
- private List
list = new ArrayList(); // 学生列表 -
- @Override
- public void addStudent(Student student) {
- this.list.add(student);
- }
-
- @Override
- public void removeStudent(Student student) {
- this.list.remove(student);
- }
-
- @Override
- public StudentIterator getStudentIterator() {
- return new StudentIteratorImpl(list);
- }
- }
- /**
- * 抽象迭代器角色接口
- */
- public interface StudentIterator {
-
- // 判断是否还有元素
- boolean hasNext();
-
- // 获取下一个元素
- Student next();
- }
- /**
- * 具体迭代器角色类
- */
- public class StudentIteratorImpl implements StudentIterator {
-
- private List
list; -
- // 用来记录遍历时的位置
- private int position = 0;
-
- public StudentIteratorImpl(List
list) { - this.list = list;
- }
-
- @Override
- public boolean hasNext() {
- return position < list.size();
- }
-
- @Override
- public Student next() {
- Student currentStudent = list.get(position);
- position++;
- return currentStudent;
- }
- }
- public class Client {
- public static void main(String[] args) {
- StudentAggregateImpl aggregate = new StudentAggregateImpl();
-
- aggregate.addStudent(new Student("张三","001"));
- aggregate.addStudent(new Student("李四","002"));
- aggregate.addStudent(new Student("王五","003"));
-
- StudentIterator iterator = aggregate.getStudentIterator();
- while (iterator.hasNext()){
- Student student = iterator.next();
- System.out.println(student);
- }
- }
- }
优点:
(1)它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的选代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义送代器的子类以支持新的遍历方式
(2)迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
(3)在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码满足开闭原则的要求。
缺点:
(1)增加了类的个数,这在一定程度上增加了系统的复杂性
(1)当需要为聚合对象提供多种遍历方式时
(2)当需要为遍历不同的聚合结构提供一个统一的接口时
(3)当访问一个聚合对象的内容而无须暴露其内部细节的表示时
注意:当我们在使用JAVA开发的时候,想使用迭代器模式的话,只要让我们自己定义的容器类实现【java.util.Iterable】 并实现其中的 iterator() 方法使其返回一个【java.util.Iterator】的实现类就可以了。