【设计模式】迭代器模式

迭代器模式(Iterator Pattern)

概念:

· 提供一种顺序访问对象元素的方法,同时又不暴露集合内部的表示;

· 目的是将遍历操作与集合对象本身分开,使同一集合可以有不同的遍历方式;

· 核心思想是将集合元素的访问和遍历责任交给迭代器对象,客户端通过迭代器访问元素,而不直接去操作集合内部结构;

UML结构:

复制代码
+----------------+          +----------------+
|    IIterator   |<-------->|   Iterator     |
+----------------+          +----------------+
| +HasNext()     |          | +HasNext()     |
| +Next()        |          | +Next()        |
+----------------+          +----------------+
         ^
         |
+----------------+          +----------------+
|   IAggregate   |<-------->|  ConcreteIter  |
+----------------+          +----------------+
| +CreateIterator()|        | -index         |
+----------------+          | -collection    |
                            +----------------+
Aggregate(集合接口):声明创建迭代器的方法 CreateIterator()
ConcreteAggregate(具体集合):实现集合接口,并返回对应迭代器
Iterator(迭代器接口):定义遍历集合的方法,如 HasNext()、Next()
ConcreteIterator(具体迭代器):实现迭代器接口,保存当前遍历位置,并访问集合元素

代码示例:

cs 复制代码
public 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}");
        }
    }
}

特点:

优点:

· 封装性好:集合内部的结构对外界隐藏,客户端无需关心集合的实现;

· 支持多种遍历方式:通过实现不同的迭代器,每个迭代器可以有自己的迭代方式;

· 符合单一职责:遍历功能由迭代器独立承担,其职责单一;

缺点:

· 增加了类和对象的数量,系统复杂性提高;

· 迭代器的状态管理成本增加;

适用场景:

· 需要访问一个聚合对象而又不暴露其内部表示时;

· 需要为一个聚合对象提供多种遍历方式时;

· 需要为遍历行为提供统一接口时(客户端无需知道集合类型);

举例场景:

· 图书馆书架;

相关推荐
青禾网络1 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO2 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯3 天前
GoF设计模式——命令模式
java·设计模式·架构
花椒技术3 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
雨落倾城夏未凉3 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
艺艺生辉4 天前
迭代器模式-"我也想被增强for循环"
设计模式
唐青枫4 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
咖啡八杯5 天前
GoF设计模式——策略模式
java·后端·spring·设计模式
唐青枫5 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net