【设计模式】迭代器模式

迭代器模式(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}");
        }
    }
}

特点:

优点:

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

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

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

缺点:

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

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

适用场景:

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

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

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

举例场景:

· 图书馆书架;

相关推荐
用户298698530143 小时前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
用户3667462526743 小时前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526743 小时前
接口文档汇总 - 3.PLC通信管理
c#
Ray Liang1 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
七月丶1 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞1 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼1 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟2 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder2 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室2 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式