【设计模式】迭代器模式

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

特点:

优点:

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

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

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

缺点:

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

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

适用场景:

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

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

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

举例场景:

· 图书馆书架;

相关推荐
峥嵘life1 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
mqiqe4 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
gugucoding4 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g5 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__5 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
依然鸣5 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
byxdaz6 小时前
QT中服务使用
开发语言·qt
库玛西7 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
caimouse7 小时前
ReactOS 图形系统分析(19):颜色转换对象 — XLATEOBJ(xlateobj.c/h)
c语言·开发语言
liulilittle7 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free