• 聊聊设计模式——迭代器模式


    目录

    迭代器模式:行为型设计模式

    优点

    缺点

    结构说明

    工作流程

    代码练习

    应用场景

    本质

    涉及的设计原则

    相关设计模式

    开源框架中的应用


    迭代器模式:行为型设计模式

            提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。

    优点

    1. 分离了集合对象和遍历逻辑:迭代器模式将集合对象的内部结构和遍历逻辑分离,使得集合对象更加简化,同时提供了一种统一的遍历方式。

    2. 支持多种遍历方式:迭代器模式可以支持不同的遍历方式,例如顺序遍历、逆序遍历等,而不需要修改聚合对象。

    3. 可扩展性:通过添加新的具体迭代器类,可以轻松扩展迭代器模式,以支持新的遍历方式。

    缺点

    1. 增加了复杂性:引入迭代器模式可能会增加代码的复杂性,因为需要定义迭代器接口和具体迭代器类。

    结构说明

    1. 迭代器接口(Iterator Interface):定义了访问和遍历聚合对象元素的方法,通常包括 next(获取下一个元素)和 hasNext(检查是否还有下一个元素)等方法。

    2. 具体迭代器(Concrete Iterator):实现迭代器接口,负责实现具体的迭代逻辑,包括追踪当前位置、获取下一个元素等。

    3. 聚合接口(Aggregate Interface):定义了创建迭代器对象的方法,通常包括 createIterator 等方法。

    4. 具体聚合类(Concrete Aggregate):实现了聚合接口,负责创建具体的迭代器对象,并提供对聚合元素的访问方式。

    工作流程

    1. 客户端通过聚合对象的工厂方法(如 createIterator)获取迭代器对象。

    2. 客户端使用迭代器对象来遍历聚合对象的元素,通过调用 next 方法获取下一个元素,通过 hasNext 方法检查是否还有下一个元素。

    3. 迭代器对象内部维护了对聚合对象的引用,以便能够顺序访问聚合对象的元素。

    代码练习

            当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。

    1.创建迭代器接口,有两种定义方式,此处采用的是方式一:

    // 接口定义方式一
    public interface Iterator {
        boolean hasNext();
        E next();
    }
    public interface Iterator {
        boolean hasNext();
        void next();
        E currentItem();
    }

    2.创建具体迭代器

    public class ConcreteIterator implements Iterator{
        private List collection;
        private int index;
    ​
        public ConcreteIterator(List collection){
            this.collection = collection;
            this.index =0;
        }
        @Override
        public boolean hasNext() {
            return index < collection.size();
        }
    ​
        @Override
        public T next() {
            if (hasNext()){
                T item = collection.get(index);
                index++;
                return item;
            }
            return null;
        }
    }

    3.创建聚合接口,主要是定义创建迭代器的方法

    public interface Aggregate {
        Iterator createIterator();
    }

    4.创建具体聚合类,创建迭代器对象,提供对聚合元素的访问方式

    public class ConcreteAggregate implements Aggregate{
        private List collection;
    ​
        public ConcreteAggregate(){
            this.collection = new ArrayList<>();
        }
    ​
        public void addItem(T item){
            this.collection.add(item);
        }
    ​
        @Override
        public Iterator createIterator() {
            return new ConcreteIterator(collection);
        }
    }

    5.客户端遍历

    public class IteratorClient {
        public static void main(String[] args) {
            ConcreteAggregate aggregate = new ConcreteAggregate<>();
            aggregate.addItem(1);
            aggregate.addItem(2);
            aggregate.addItem(3);
    ​
            Iterator iterator = aggregate.createIterator();
            while (iterator.hasNext()){
                Integer item = iterator.next();
                System.out.println(item);
            }
        }
    }

    应用场景

    1. 当需要以统一的方式访问不同类型的聚合对象(如列表、树、图等)的元素时,可以考虑使用迭代器模式。

    2. 当需要隐藏聚合对象的内部表示,并提供一种统一的访问方式时,迭代器模式非常有用。

    3. 当需要在不依赖聚合对象的具体类的情况下遍历聚合对象的元素时,可以使用迭代器模式。

    本质

    迭代器模式的本质是提供一种统一的方式来访问聚合对象的元素,将迭代逻辑封装到迭代器对象中。

    涉及的设计原则

    1. 单一职责原则(Single Responsibility Principle):迭代器模式将迭代逻辑从聚合对象中分离出来,使得每个类都有一个单一的职责。

    相关设计模式

    • 迭代器模式通常与职责链模式(Chain of Responsibility Pattern)结合使用,以实现复杂的过滤和遍历逻辑。

    开源框架中的应用

    1. Java中的迭代器:Java中的集合框架(如ArrayList、HashSet等)都提供了内置的迭代器,可以用于遍历集合中的元素。

    2. .NET中的LINQ:Language-Integrated Query(LINQ)是.NET框架中的一个功能,它允许使用类似SQL的查询语言来查询集合数据,背后使用了迭代器模式。

    3. Spring框架 - 数据访问:Spring框架中的JdbcTemplate使用了迭代器模式来遍历数据库查询结果集。

    4. Android中的Cursor:在Android中,Cursor对象用于遍历数据库查询结果,实际上是迭代器模式的应用。

  • 相关阅读:
    未来的金融服务永远不会停歇,牛市仍将继续 2021-05-28
    【云原生 · Kubernetes】apiserver高可用
    Linux服务搭建 -- NTP服务
    ​​​​​​​Python---练习:打印直角三角形(利用wihle循环嵌套)
    Android实现设置界面
    Linux —— 线程
    我的DW个人网站设计——安徽宣城6页HTML+CSS+JavaScript
    Small Pipefish
    小红书保姆级教程 | 2023达人投放怎么做?
    2022乐鑫数字芯片提前批笔试
  • 原文地址:https://blog.csdn.net/Elaine2391/article/details/133132738