• 设计模式:迭代器模式


    迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。迭代器模式将遍历和操作聚合对象的责任分离,使得遍历算法可以独立于聚合对象变化而变化。
    在迭代器模式中,聚合对象包含一个迭代器接口,定义了访问和遍历元素的方法。具体的聚合对象实现该接口,返回一个具体的迭代器对象。迭代器对象负责追踪聚合对象中的当前位置,并提供访问和操作元素的方法。
    迭代器模式的核心思想是将遍历算法和聚合对象解耦,使得它们可以独立演化。这样可以提供多种不同的遍历方式,而无需修改聚合对象的结构。

    组件

    迭代器模式通常包含以下组件:

    1. 迭代器接口(Iterator Interface):定义了访问和遍历元素的方法,如获取下一个元素、判断是否还有下一个元素等。
    2. 具体迭代器(Concrete Iterator):实现了迭代器接口,负责追踪聚合对象中的当前位置,并提供访问和操作元素的方法。
    3. 聚合接口(Aggregate Interface):定义了创建迭代器对象的方法,如获取迭代器。
    4. 具体聚合类(Concrete Aggregate):实现了聚合接口,创建具体的迭代器对象。
    5. 客户端(Client):使用迭代器对象来遍历和访问聚合对象中的元素。
      迭代器模式中的关键组件是迭代器接口和具体迭代器,它们负责访问和遍历聚合对象中的元素。聚合接口和具体聚合类用于创建迭代器对象,并提供对聚合对象的访问。客户端使用迭代器对象来遍历和访问聚合对象中的元素,而无需了解聚合对象的内部表示。
      需要注意的是,以上是迭代器模式的一般组件,具体实现可能会根据应用场景的不同而有所变化。

    代码示例

    import java.util.ArrayList;
    import java.util.List;
     // 迭代器接口
    interface Iterator {
        boolean hasNext();
        Object next();
    }
     // 聚合接口
    interface Aggregate {
        Iterator createIterator();
    }
     // 具体迭代器
    class ConcreteIterator implements Iterator {
        private List<Object> items;
        private int position = 0;
         public ConcreteIterator(List<Object> items) {
            this.items = items;
        }
         public boolean hasNext() {
            return position < items.size();
        }
         public Object next() {
            if (this.hasNext()) {
                return items.get(position++);
            }
            return null;
        }
    }
     // 具体聚合类
    class ConcreteAggregate implements Aggregate {
        private List<Object> items = new ArrayList<>();
         public Iterator createIterator() {
            return new ConcreteIterator(items);
        }
         public void addItem(Object item) {
            items.add(item);
        }
    }
     // 客户端代码
    public class Main {
        public static void main(String[] args) {
            ConcreteAggregate aggregate = new ConcreteAggregate();
            aggregate.addItem("Item 1");
            aggregate.addItem("Item 2");
            aggregate.addItem("Item 3");
             Iterator iterator = aggregate.createIterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    在上述示例中,我们定义了迭代器接口(Iterator)和聚合接口(Aggregate)。具体迭代器(ConcreteIterator)实现了迭代器接口,负责追踪聚合对象中的当前位置并提供访问元素的方法。具体聚合类(ConcreteAggregate)实现了聚合接口,创建具体的迭代器对象。在客户端代码中,我们创建了具体聚合对象,并使用迭代器对象来遍历和访问聚合对象中的元素。
    这个示例展示了如何使用Java实现迭代器模式,通过迭代器对象来遍历和访问聚合对象中的元素,而无需了解聚合对象的内部表示。

    源码中使用

    迭代器模式在源码中有很多应用。以下是一些常见的源码中使用迭代器模式的情况:

    1. Java中的集合框架:Java的集合框架中,例如ArrayList、LinkedList等,都实现了迭代器模式。通过调用集合对象的 iterator() 方法,可以获取到对应的迭代器对象,用于遍历集合中的元素。
    2. JDBC中的结果集(ResultSet):JDBC中的结果集对象也实现了迭代器模式。通过调用结果集对象的 next() 方法,可以逐行遍历查询结果。
    3. Java中的IO流:Java中的IO流,如BufferedReader、Scanner等,也使用了迭代器模式。通过调用读取方法(如 readLine() )来逐行读取文件内容。
    4. Spring框架中的JdbcTemplate:Spring框架中的JdbcTemplate类使用迭代器模式来遍历查询结果集。通过调用 query() 方法,可以获取到结果集对象,然后使用迭代器来逐行处理查询结果。
      这些是迭代器模式在源码中的一些常见应用。迭代器模式通过提供一个统一的接口来遍历集合或者其他容器对象,使得客户端可以统一处理不同类型的容器对象。这样可以提高代码的可读性和可维护性,并且降低了与容器对象的耦合度。

    优劣点

    优点:

    1. 简化集合遍历:迭代器模式提供了一种统一的方式来遍历集合对象,无需暴露集合的内部结构,使得遍历操作更加简化和统一。
    2. 支持多种遍历方式:迭代器模式可以针对同一个集合对象实现多个不同的迭代器,每个迭代器可以提供不同的遍历方式,满足不同的需求。
    3. 隐藏集合实现细节:迭代器模式将集合的实现细节封装在迭代器中,使得客户端无需关注集合的内部结构,只需通过迭代器进行遍历操作。
    4. 支持并发访问:某些迭代器实现可以支持多线程并发访问,提供了线程安全的遍历操作。
      缺点:
    5. 增加了类的数量:引入迭代器模式会增加额外的迭代器类,增加了系统的复杂性和代码的维护成本。
    6. 遍历过程中的修改问题:如果在遍历过程中修改了集合对象,可能会导致迭代器的状态不一致,引发错误。
    7. 遍历效率问题:某些迭代器实现可能会影响遍历的效率,特别是在底层数据结构复杂的情况下。

    总结

    迭代器模式提供了一种简化和统一的方式来遍历集合对象,隐藏了集合的内部结构,提供了多种遍历方式。虽然引入了额外的类和复杂性,但它提供了灵活性和可维护性。在设计中,需要权衡迭代器模式的优点和缺点,确保合理使用。

  • 相关阅读:
    【开源】EValidator Java简单校验工具二
    编译报错 internal compiler error: Segmentation fault 解决方法
    android获取webView加载H5链接,截取url参数
    Nginx缓存配置教程
    Redis
    8.Ribbon负载均衡服务调用
    Docker从入门到放弃(1) Docker简介与安装
    极端气候?自然灾害?【实战】机器学习预测森林火灾
    1 什么是Zookeeper 能干什么
    第11章 Redis(一)
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945778