• 设计模式 行为型模式 - 迭代器模式(八)


     一、概述

    定义:

    提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

    二、结构

    选代器模式主要包含以下角色:

    (1)抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建选代器对象的接口。

    (2)具体聚合(concreteAggregate)角色:实现抽象聚合类,返回一个具体选代器的实例

    (3)抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。

    (4)具体选代器(concretelterator)角色:实现抽象选代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置

    三、案例实现

     

    1. 抽象聚合角色

    1. /**
    2. * 抽象聚合对象接口
    3. */
    4. public interface StudentAggregate {
    5. // 添加学生功能
    6. void addStudent(Student student);
    7. // 删除学生功能
    8. void removeStudent(Student student);
    9. // 获取迭代器对象功能
    10. StudentIterator getStudentIterator();
    11. }

    2. 具体聚合角色

    1. /**
    2. * 具体聚合角色
    3. */
    4. public class StudentAggregateImpl implements StudentAggregate {
    5. private List list = new ArrayList(); // 学生列表
    6. @Override
    7. public void addStudent(Student student) {
    8. this.list.add(student);
    9. }
    10. @Override
    11. public void removeStudent(Student student) {
    12. this.list.remove(student);
    13. }
    14. @Override
    15. public StudentIterator getStudentIterator() {
    16. return new StudentIteratorImpl(list);
    17. }
    18. }

    3. 抽象迭代器角色

    1. /**
    2. * 抽象迭代器角色接口
    3. */
    4. public interface StudentIterator {
    5. // 判断是否还有元素
    6. boolean hasNext();
    7. // 获取下一个元素
    8. Student next();
    9. }

    4. 具体选代器角色

    1. /**
    2. * 具体迭代器角色类
    3. */
    4. public class StudentIteratorImpl implements StudentIterator {
    5. private List list;
    6. // 用来记录遍历时的位置
    7. private int position = 0;
    8. public StudentIteratorImpl(List list) {
    9. this.list = list;
    10. }
    11. @Override
    12. public boolean hasNext() {
    13. return position < list.size();
    14. }
    15. @Override
    16. public Student next() {
    17. Student currentStudent = list.get(position);
    18. position++;
    19. return currentStudent;
    20. }
    21. }

    5. 客户端类

    1. public class Client {
    2. public static void main(String[] args) {
    3. StudentAggregateImpl aggregate = new StudentAggregateImpl();
    4. aggregate.addStudent(new Student("张三","001"));
    5. aggregate.addStudent(new Student("李四","002"));
    6. aggregate.addStudent(new Student("王五","003"));
    7. StudentIterator iterator = aggregate.getStudentIterator();
    8. while (iterator.hasNext()){
    9. Student student = iterator.next();
    10. System.out.println(student);
    11. }
    12. }
    13. }

    四、优缺点

    优点:

    (1)它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的选代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义送代器的子类以支持新的遍历方式

    (2)迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。

    (3)在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码满足开闭原则的要求。

    缺点:

    (1)增加了类的个数,这在一定程度上增加了系统的复杂性

    五、使用场景

    (1)当需要为聚合对象提供多种遍历方式时

    (2)当需要为遍历不同的聚合结构提供一个统一的接口时

    (3)当访问一个聚合对象的内容而无须暴露其内部细节的表示时

    六、JDK 源码解析

     

     

    注意:
    当我们在使用JAVA开发的时候,想使用迭代器模式的话,只要让我们自己定义的容器类实现【java.util.Iterable】 并实现其中的  iterator() 方法使其返回一个【java.util.Iterator】的实现类就可以了。

  • 相关阅读:
    股票买卖问题I、II、III、IV、V、VI
    linux下常用的终端命令
    Vector和LinkedList底层结构和源码剖析
    HTTP 415错误状态码
    C++11 正则表达式详解
    [vue2项目]vue2+supermap[mapboxgl]+天地图之地图的基础操作(画线+自定义打点)
    manacher算法
    Aztec.nr:Aztec的隐私智能合约框架——用Noir扩展智能合约功能
    设计模式学习(七):适配器模式
    彩色图像处理彩色模型
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/127658853