当前位置: 首页 > news >正文

23中设计模式-迭代器(Iterator)设计模式

迭代器设计模式

  • 🚩什么是迭代器设计模式?
  • 🚩迭代器设计模式的特点
  • 🚩迭代器设计模式的结构
  • 🚩迭代器设计模式的优缺点
  • 🚩迭代器设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是迭代器设计模式?

迭代器设计模式(Iterator Pattern) 是一种 行为型设计模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式将遍历数据的职责从聚合对象中分离出来,使得聚合对象可以更专注于数据存储,而迭代器则专注于遍历数据。

使用场景

  • 访问一个聚合对象的内容而无需暴露其内部表示

  • 为聚合对象提供多种遍历方式

  • 为不同的聚合结构提供统一的遍历接口

  • 适用于 集合类树形结构图结构 等数据结构的遍历

🚩迭代器设计模式的特点

  • 分离集合对象的遍历行为:将遍历算法与集合对象分离

  • 多种遍历方式:可以为同一个聚合对象提供多种遍历方式

  • 统一的遍历接口:为不同的聚合结构提供统一的遍历接口

  • 简化聚合接口:聚合对象不需要提供多种遍历方法

  • 并行遍历:支持对同一聚合对象的多个同时遍历

🚩迭代器设计模式的结构

迭代器模式主要包含以下部分:

  • Iterator(迭代器接口):定义访问和遍历元素的接口

  • ConcreteIterator(具体迭代器):实现迭代器接口,跟踪当前访问位置

  • Aggregate(聚合接口):定义创建相应迭代器对象的接口

  • ConcreteAggregate(具体聚合):实现创建相应迭代器的接口

  • Client(客户端):通过迭代器遍历聚合对象

🚩迭代器设计模式的优缺点

✅ 优点

  • 支持多种遍历方式:可以同时使用不同的方式遍历同一个聚合

  • 简化聚合类:将遍历逻辑从聚合类中分离出来

  • 符合单一职责原则:将管理集合和遍历集合的职责分离

  • 符合开闭原则:可以新增迭代器而无需修改聚合类

  • 隐藏内部实现:客户端无需知道聚合的内部结构

❌ 缺点

  • 增加系统复杂度:对于简单的聚合可能过度设计

  • 性能开销:迭代器模式可能会带来一定的性能开销

  • 增加类的数量:每个聚合类都需要对应的迭代器类

🚩迭代器设计模式的Java实现

代码地址:GitHub

  • 创建 Book 类(聚合元素)
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Book
 * @Description 书籍类 - 聚合中的元素
 * @date 2025/3/25 19:07
 **/
public class Book {

    private String name;
    private double price;

    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}
  • 创建 Iterator 接口
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Iterator
 * @Description 迭代器接口
 * @date 2025/3/25 19:09
 **/
public interface Iterator {
    boolean hasNext();
    Book next();
}
  • 创建 Aggregate 接口
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Aggregate
 * @Description 聚合接口
 * @date 2025/3/25 19:10
 **/
public interface Aggregate {
    Iterator createIterator();
}
  • 创建 BookAggregate 具体聚合类
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName BookAggregate
 * @Description 具体聚合类 - 书籍集合
 * @date 2025/3/25 19:10
 **/
public class BookAggregate implements Aggregate {

    private List<Book> list = new ArrayList<>();

    public void add(Book book) {
        list.add(book);
    }

    public Book get(int index) {
        return list.get(index);
    }

    public int getSize() {
        return list.size();
    }

    @Override
    public Iterator createIterator() {
        return new BookIterator(this);
    }
}
  • 创建 BookIterator 具体迭代器
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName BookIterator
 * @Description 具体迭代器
 * @date 2025/3/25 19:12
 **/
public class BookIterator implements Iterator {

    private int index;
    private BookAggregate bookAggregate;

    public BookIterator(BookAggregate bookAggregate) {
        this.index = 0;
        this.bookAggregate = bookAggregate;
    }

    @Override
    public boolean hasNext() {
        return index < bookAggregate.getSize();
    }

    @Override
    public Book next() {
        Book book = bookAggregate.get(index);
        index++;
        return book;
    }
}
  • 测试迭代器模式
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName IteratorPattern
 * @Description 测试迭代器模式
 * @date 2025/3/25 19:13
 **/
public class IteratorPattern {
    public static void main(String[] args) {
        BookAggregate bookAggregate = new BookAggregate();

        String[] books = {"数据结构", "操作系统", "计算机网络", "计算机组成原理"};
        double[] prices = {10.24, 20.48, 40.96, 81.92};

        for (int i = 0; i < books.length; i++) {
            bookAggregate.add(new Book(books[i], prices[i]));
        }
        Iterator iterator = bookAggregate.createIterator();
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println(book.getName() + " " + book.getPrice());
        }
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • Book 类表示聚合中的元素

  • Iterator 接口定义遍历操作

  • Aggregate 接口定义创建迭代器的方法

  • BookAggregate 是具体聚合类,管理Book对象的集合

  • BookIterator 是具体迭代器,实现遍历逻辑

  • IteratorPattern 客户端使用迭代器遍历聚合对象

🚩总结

  • 迭代器设计模式 提供了一种方法顺序访问聚合对象中的元素

  • 核心是 将遍历行为从聚合对象中分离出来,使两者可以独立变化

  • 适用于 需要遍历集合对象而又不暴露其内部结构 的场景

✅ Java源码中的应用场景:

  • Java集合框架

    • java.util.Iterator 接口

    • 所有集合类都实现了迭代器模式

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

相关文章:

  • Netty源码—Pipeline和Handler(二)
  • Day39 | 724. 寻找数组的中心下标、34. 在排序数组中查找元素的第一个和最后一个位置、922. 按奇偶排序数组 II、35. 搜索插入位置
  • 如何用腾讯云建站做好一个多语言的建筑工程网站?海外用户访问量提升3倍!分享我的经验
  • 加新题了,MySQL 8.0 OCP 认证考试 题库更新
  • 通信系统的性能指标
  • MySql INDEX
  • Python:进程池,同步和异步,进程池通信示例
  • 集星獭 | 平滑适配多系统打通商管业财数据脉络
  • Java动态生成Word终极指南:poi-tl与Aspose.Words性能对比及选型建议
  • 如何避免测试数据准备不充分或不可复用
  • 第二章 EXI协议原理与实现--9.7 cbExiGen库bug及改进
  • Android adb自身调试log开关
  • HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?
  • 基于Ebay拍卖网站成交价格的影响因素分析
  • 【TI MSPM0】PWM学习
  • Android 12.0 WiFi连接默认设置静态IP地址功能实现
  • ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景
  • 如何突破MacBook苹果电脑Cursor限制:免费版的解决方法
  • 【Linux线程】——线程同步线程互斥
  • SpringMVC 请求与响应处理详解
  • 服装网站建设可行性分析/虎扑体育网体育
  • 腾讯云服务器安装wordpress/优化设计答案六年级
  • 社区微网站建设方案ppt模板/厦门百度广告开户
  • 网站有没有做等级测评怎么查看/电脑培训机构哪个好
  • 京东网站的设计风格/免费学生html网页制作成品
  • 电商网站的模式/拼多多代运营一般多少钱