迭代器模式(Iterator Pattern)
概念:
· 提供一种顺序访问对象元素的方法,同时又不暴露集合内部的表示;
· 目的是将遍历操作与集合对象本身分开,使同一集合可以有不同的遍历方式;
· 核心思想是将集合元素的访问和遍历责任交给迭代器对象,客户端通过迭代器访问元素,而不直接去操作集合内部结构;
UML结构:
+----------------+ +----------------+ | IIterator |<-------->| Iterator | +----------------+ +----------------+ | +HasNext() | | +HasNext() | | +Next() | | +Next() | +----------------+ +----------------+ ^ | +----------------+ +----------------+ | IAggregate |<-------->| ConcreteIter | +----------------+ +----------------+ | +CreateIterator()| | -index | +----------------+ | -collection | +----------------+ Aggregate(集合接口):声明创建迭代器的方法 CreateIterator() ConcreteAggregate(具体集合):实现集合接口,并返回对应迭代器 Iterator(迭代器接口):定义遍历集合的方法,如 HasNext()、Next() ConcreteIterator(具体迭代器):实现迭代器接口,保存当前遍历位置,并访问集合元素代码示例:
cspublic interface IBookIterator { bool HasNext(); Book Next(); } public class Book { public string _Name { get; set; } public Book(string name) { this._Name = name; } } public class BookShelf { private readonly List<Book> _books = new(); public BookShelfIterator CreateIterator() { return new BookShelfIterator(_books); } public void AddBook(Book book) { if (book == null || _books.Contains(book)) return; _books.Add(book); } } public class BookShelfIterator : IBookIterator { private readonly List<Book> _books; private int _index = 0; public BookShelfIterator(List<Book> books) { this._books = books; } public bool HasNext() { return _index < _books.Count; } public Book Next() { return _books[_index++]; } } public class Client { public static void Main() { BookShelf bookShelf = new(); IBookIterator bookIterator = bookShelf.CreateIterator(); bookShelf.AddBook(new Book("设计模式")); bookShelf.AddBook(new Book("数据结构与算法")); bookShelf.AddBook(new Book("C# 高级编程")); bookShelf.AddBook(new Book("操作系统原理")); while (bookIterator.HasNext()) { Console.WriteLine($"书名:{bookIterator.Next()._Name}"); } } }特点:
优点:
· 封装性好:集合内部的结构对外界隐藏,客户端无需关心集合的实现;
· 支持多种遍历方式:通过实现不同的迭代器,每个迭代器可以有自己的迭代方式;
· 符合单一职责:遍历功能由迭代器独立承担,其职责单一;
缺点:
· 增加了类和对象的数量,系统复杂性提高;
· 迭代器的状态管理成本增加;
适用场景:
· 需要访问一个聚合对象而又不暴露其内部表示时;
· 需要为一个聚合对象提供多种遍历方式时;
· 需要为遍历行为提供统一接口时(客户端无需知道集合类型);
举例场景:
· 图书馆书架;
【设计模式】迭代器模式
大飞pkz2025-10-01 18:30
相关推荐
Scott9999HH17 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准EIP低代码平台17 小时前
EIP 低代码平台 - 角色维护码智社18 小时前
AES加密原理详解及Java实现加解密实战AI云海18 小时前
python 列表、元组、集合和字典萧瑟余晖19 小时前
JDK 26 新特性详解马优晨19 小时前
Freemarker 完整讲解(后端 Java 模板引擎)人邮异步社区21 小时前
怎么把C语言学到精通?心平气和量大福大1 天前
C#-WPF-控件-TextBox 数据绑定ttwuai1 天前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验এ慕ོ冬℘゜1 天前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途