【设计模式】迭代器模式

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

特点:

优点:

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

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

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

缺点:

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

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

适用场景:

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

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

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

举例场景:

· 图书馆书架;

相关推荐
tang&22 分钟前
【Python自动化测试】Selenium常用函数详解
开发语言·python·selenium
卜锦元1 小时前
Golang项目开发过程中好用的包整理归纳(附带不同包仓库地址)
开发语言·后端·golang
Tony Bai5 小时前
“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈:Go 的诞生、演进与未来
开发语言·后端·golang
sali-tec5 小时前
C# 基于halcon的视觉工作流-章66 四目匹配
开发语言·人工智能·数码相机·算法·计算机视觉·c#
hnlgzb6 小时前
安卓app开发,如何快速上手kotlin和compose的开发?
android·开发语言·kotlin
无敌最俊朗@7 小时前
STL-deque面试剖析(面试复习4)
开发语言
APIshop7 小时前
用 Python 把“API 接口”当数据源——从找口子到落库的全流程实战
开发语言·python
Java Fans7 小时前
Qt Designer 和 PyQt 开发教程
开发语言·qt·pyqt
RwTo7 小时前
【源码】-Java线程池ThreadPool
java·开发语言
兮动人7 小时前
EMT4J定制规则版:Java 8→17迁移兼容性检测与规则优化实战
java·开发语言·emt4j