第20章:迭代器模式

迭代器模式

迭代器模式(iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

迭代器模式适用情况:

  1. 需要访问一个聚集对象,而且不管这些对象是什么都需要遍历

  2. 需要对聚集有多种遍历方式

迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

迭代器模式分离了集合对象的遍历行为,抽象出-个迭代器类来负责,这样既可以不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。迭代器模式在访问数组、集合、列表等数据时,尤其是数据库数据操作时,应用非常普遍,各种高级语言都对它进行了封装。

Iterator迭代器抽象类

Aggregate聚集抽象类

ConcreteIteratorConcreteIteratorDesc具体迭代器类,继承Iterator


ConcreteAggregate具体聚集类,继承Aggregate

客户端代码


运行结果

.NET的迭代器实现

IEumerator支持对非泛型集合的简单迭代接口。

IEumerable公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。

客户端代码

foreach in在编译器中的工作

迭代器模式示例

任务:公交人工售票

GoF实现

from abc import ABC, abstractmethod
from typing import Any, Text
class Iterator(ABC):"""迭代器抽象类"""@abstractmethoddef first(self) -> Any:pass@abstractmethoddef next_(self) -> Any:pass@abstractmethoddef is_done(self) -> bool:pass@abstractmethoddef current_item(self) -> Any:pass
class Aggregate(ABC):"""聚集抽象类"""@abstractmethoddef create_iterator(self) -> Iterator:pass
class ConcreteIterator(Iterator):"""具体迭代器类"""def __init__(self, aggregate: Aggregate) -> None:self.__aggregate = aggregateself.__current = 0def first(self) -> Any:return self.__aggregate[0]def next_(self) -> Any:ret = Noneself.__current += 1if self.__current < self.__aggregate.count:ret = self.__aggregate[self.__current]return retdef is_done(self) -> bool:return True if self.__current >= self.__aggregate.count else Falsedef current_item(self) -> Any:return self.__aggregate[self.__current]class ConcreteIteratorDesc(Iterator):"""具体迭代器类(逆序)"""def __init__(self, aggregate: Aggregate) -> None:self.__aggregate = aggregateself.__current = self.__aggregate.count - 1def first(self) -> Any:return self.__aggregate[-1]def next_(self) -> Any:ret = Noneself.__current -= 1if self.__current > self.__aggregate.count:ret = self.__aggregate[self.__current]return retdef is_done(self) -> bool:return True if self.__current <= 0 else Falsedef current_item(self) -> Any:return self.__aggregate[self.__current]
class ConcreteAggregate(Aggregate):"""具体聚集类"""def __init__(self):self.__items = []def create_iterator(self) -> Iterator:return ConcreteIterator(self)@propertydef count(self) -> int:return len(self.__items)def __getitem__(self, index: int) -> Any:"""item[idx]"""return self.__items[index]def __setitem__(self, index: int, value: Any) -> None:"""mapping op (items[idx] = value) to insert"""# self.__items[index] = valueself.__items.insert(index, value)def __delitem__(self, index: int) -> None:"""del item[idx]"""self.__items.pop(index)# def insert(self, index: int, value: Any) -> None:#     self.__items.insert(index, value)
# 客户端代码
if __name__ == "__main__":a = ConcreteAggregate()a[0] = "大鸟"a[1] = "小菜"a[2] = "行李"a[3] = "老外"a[4] = "公交内部员工"a[5] = "小偷"print("** 顺序 **")i = ConcreteIterator(a)item = i.first()while not i.is_done():print(i.current_item(), "请买车票!")i.next_()print("** 逆序 **")i_ = ConcreteIteratorDesc(a)item = i_.first()while not i_.is_done():print(i_.current_item(), "请买车票!")i_.next_()
** 顺序 **
大鸟 请买车票!
小菜 请买车票!
行李 请买车票!
老外 请买车票!
公交内部员工 请买车票!
小偷 请买车票!
** 逆序 **
小偷 请买车票!
公交内部员工 请买车票!
老外 请买车票!
行李 请买车票!
小菜 请买车票!

Python迭代器模式

# 客户端代码
if __name__ == "__main__":a = []a.append("大鸟")a.append("小菜")a.append("老外")a.append("公交内部员工")a.append("小偷")for item in a:print(item, "请买车票!")
大鸟 请买车票!
小菜 请买车票!
老外 请买车票!
公交内部员工 请买车票!
小偷 请买车票!

大话设计模式:第20章 迭代器模式相关推荐

  1. 大话设计模式 第二十三章 命令模式 考羊肉串

    命令模式 使请求的调用者和实现者解耦 请求通过命令来传递 命令被封装成对象 烤肉之摊贩 摊贩 烤羊肉串 烤羊肉串 烤鸡翅 public class BarbecuerTest {public void ...

  2. 第 19 章 迭代器模式

    第 19 章 迭代器模式 1.学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系. 如图: 2.传统方案解决学校院系展 ...

  3. 大话设计模式Python实现-简单工厂模式

    简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 1 #!/us ...

  4. 《Head first设计模式》学习笔记 – 迭代器模式

    迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了! 真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃 ...

  5. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  6. 23种设计模式(第二章创建者模式5种)

    第二章创建者模式 单例模式 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的实现 单例设计模式分类两种: ​ ...

  7. lt;二gt;读lt;lt;大话设计模式gt;gt;之策略模式

    又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...

  8. PHP设计模式(6)迭代器模式

    迭代器(Iterator)模式,在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之 ...

  9. 大战设计模式【12】—— 迭代器模式

    迭代器模式(Iterator) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 提供一种方法顺序访问一个聚合 ...

最新文章

  1. java cms cpu占用率_cpu使用率过高和jvm old占用过高排查过程
  2. POJ 3347 Kadj Squares(复杂的线段相交问题)
  3. 如何求一个数的因数 c语言代码,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  4. Kubernetes 1.6新特性
  5. 读CLR via C#总结(7) 以传引用的方式向方法传递参数---refout
  6. Docker基础知识:Containers,Namespace,CGroups
  7. java----动态绑定
  8. C#编程总结(十一)数字证书
  9. 用css实现了一个精致的纵向导航菜单
  10. Reinforcement Learning(001)
  11. ip定压终端服务器是什么,IP网络功放 IP网络物联功放 IP网络联机功放 IP网络数字定压功放...
  12. 学校计算机管理维修制度,青岛滨海学院计算机机房管理制度
  13. powershell环境下的“ping”命令
  14. mysql不支持rank()_Mysql 实现 rank 和 != 问题
  15. REWORK读书笔记
  16. 虚拟机上装oracle,cmd窗口输入法有问题,按了U,I,O,P,J,K,L,M这些键为什么不是UIOPJK
  17. Unity3D学习记录 (跑酷小游戏完结)
  18. mysql的连接配置时区语句
  19. 32位程序和64位程序这些区别你知道吗?
  20. 以 VS Code为例,看大型开源项目是如何应用软件工程的?

热门文章

  1. ubuntu 下火狐 使用迅雷看看
  2. fileitem方法_浅谈FileItem类的常用方法
  3. 【Linux】vim常用命令
  4. CSS margin 属性详解
  5. ppt转html office2013,PowerPoint2013演示文稿直接转换成为Word文档的方法
  6. Solidworks2022草图标注尺寸和实际尺寸不符如何解决?
  7. 【AutoSAR】【以太网】Eth Driver
  8. linux sftp 上传文件内容为空,求linux 下 C/c++ 实现SFTP上传文件的代码,或shell 写的如何区分上传是否成功?...
  9. Android--最新常用框架
  10. Redis学习之秒杀案例