设计模式Python版 迭代器模式


前言

GOF设计模式分三大类:

  • 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
  • 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
  • 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

一、迭代器模式

迭代器模式(Iterator Pattern)

  • 定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。

  • 解决问题:如何间接遍历一个聚合对象中的元素?

  • 使用场景:

    • 访问一个聚合对象的内容而无须暴露它的内部表示。
    • 需要为一个聚合对象提供多种遍历方式。
    • 为遍历不同的聚合结构提供一个统一的接口
  • 组成:

    • Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法。例如first() next() has_next() current_item()
    • ConcreteIterator(具体迭代器):它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置。在具体实现时,游标通常是一个表示位置的非负整数。
    • Aggregate(抽象聚合类):它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。
    • ConcreteAggregate(具体聚合类):它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。
  • 补充说明:

    • 在软件开发中,也存在大量类似电视机一样的类,它们可以存储多个成员对象(元素),这些类通常称为聚合类(Aggregate Classes),对应的对象称为聚合对象。
    • 通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式。
    • 迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来。聚合对象只负责存储数据,而遍历数据由迭代器来完成。
    • 在迭代器模式结构中包含聚合和迭代器两个层次结构。考虑到系统的灵活性和可扩展性,在迭代器模式中应用了工厂方法模式
    • 在迭代器模式中应用了工厂方法模式,抽象迭代器对应于抽象产品角色,具体迭代器对应于具体产品角色,抽象聚合类对应于抽象工厂角色,具体聚合类对应于具体工厂角色。
    • 由于很多编程语言的类库都已经实现了迭代器模式,因此在实际开发中,只需要直接使用Python等语言已定义好的迭代器即可。
  • 优点:

    • 由迭代器来提供遍历聚合对象内部数据的行为,这将简化聚合对象的设计,更符合单一职责原则的要求。
    • 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。
    • 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足开闭原则的要求。
  • 缺点:

    • 类的个数增加,这在一定程度上增加了系统的复杂性。

在这里插入图片描述

二、迭代器模式示例

使用迭代器模式,设计销售管理系统中数据的遍历

  • AbstractObjectList充当抽象聚合类,ProductList充当具体聚合类,AbstractIterator充当抽象迭代器,ProductIterator充当具体迭代器。
### 迭代器模式
"""抽象迭代器"""


class AbstractIterator:
    def next(self):
        # 返回下一个元素
        raise NotImplementedError

    def is_last(self) -> bool:
        # 是否为最后一个元素
        raise NotImplementedError

    def previous(