【设计模式】迭代器模式

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

特点:

优点:

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

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

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

缺点:

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

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

适用场景:

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

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

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

举例场景:

· 图书馆书架;

相关推荐
aq55356004 分钟前
PHP vs Python:30秒看懂核心区别
开发语言·python·php
我是无敌小恐龙6 分钟前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习
码云数智-大飞43 分钟前
零基础微信小程序制作平台哪个好
开发语言
神仙别闹1 小时前
基于 MATLAB 实现的 DCT 域的信息隐藏
开发语言·matlab
techdashen1 小时前
Go 标准库 JSON 包迎来重大升级:encoding/json/v2 实验版来了
开发语言·golang·json
.千余2 小时前
【Linux】基本指令3
linux·服务器·开发语言·学习
Pkmer2 小时前
古法编程: 代理模式
后端·设计模式
南境十里·墨染春水2 小时前
C++ 笔记 thread
java·开发语言·c++·笔记·学习
南境十里·墨染春水2 小时前
C++ 笔记 高级线程同步原语与线程池实现
java·开发语言·c++·笔记·学习
Pkmer2 小时前
古法编程: 责任链模式
后端·设计模式