Design 迭代器模式

基本介绍

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

迭代器模式属于行为型模式。

特点:提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示

案例图示

迭代器模式分为2个大类,一类用于存储数据(可迭代对象),一类获取迭代时产生的数据(迭代器),迭代器由可迭代对象创建,迭代器中包含可迭代对象中的被迭代数据,每次重新迭代可迭代对象时都会创建一个专属的迭代器,迭代器中的数据被迭代完成后,该迭代器失效:

image-20210413235825434

优缺点

优点:

  • 支持以不同的方式遍历一个聚合对象
  • 迭代器简化了聚合类
  • 在同一个聚合上可以有多个遍历

缺点:

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性

Python实现

用Python实现迭代器模式,其实Python本身已经实现了迭代器模式,并且还支持生成器,通过next()进行调用即可,这里写一个迭代原理:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-


class IterableClass(object):
    """可迭代对象"""

    def __init__(self, *args):
        self.args = args

    def __iter__(self):
        # 被迭代时,创建迭代器对象
        return IteratorClass(self.args)


class IteratorClass(object):
    """迭代器"""

    def __init__(self, args):
        self.args = args
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        try:
            return_value = self.args[self.index]
        except IndexError:
            raise StopIteration
        self.index += 1
        return return_value


if __name__ == '__main__':
    # 进行迭代
    iterable = IterableClass(1, 2, 3, 4)
    # 通过迭代对象创建出其迭代器
    # 包含迭代对象本身所有元素
    iterator = iter(iterable)

    # 对迭代器进行迭代
    while 1:
        try:
            print(next(iterator))
        except StopIteration:
            break

结果如下:

1
2
3
4

Golang实现

用Golang实现迭代器模式:

...
posted @ 2021-04-14 00:08  云崖君  阅读(40)  评论(0编辑  收藏  举报