漫谈设计模式 [14]:迭代器模式

embedded/2024/9/20 3:56:46/ 标签: 设计模式, 迭代器模式, python

引导性开场

菜鸟:

最近在处理一个项目时,我遇到一个问题。我需要遍历一个集合中的元素,但集合的结构可能会变化。每次我都要写很多重复的代码,这让我很困惑。有没有更好的方法呢?

老鸟:

这个问题很常见。你有没有听说过迭代器模式

菜鸟:

迭代器模式?听起来有点陌生,你能详细说说吗?

渐进式介绍概念

老鸟:

当然可以!我们先从一个生活中的例子开始。想象你有一本书,你想一页一页地阅读。你会一页一页地翻,而不是一次性把所有页都看完,对吧?迭代器模式就是这样的一个“翻页器”,它让你可以逐个处理集合中的元素,而不需要关心集合的内部结构。

菜鸟:

那听起来挺直观的。那这种模式的核心思想是什么呢?

老鸟:

核心思想很简单:通过提供一种方法,使你能够顺序地访问一个集合中的元素,而不需要暴露集合的内部表示。

Python代码示例,逐步展开

菜鸟:

那能给我一个简单的代码示例吗?

老鸟:

好的,我们先从一个最简单的例子开始。假设我们有一个列表,我们想要逐个访问它的元素。

python">class SimpleIterator:def __init__(self, collection):self._collection = collectionself._index = 0def __next__(self):if self._index < len(self._collection):result = self._collection[self._index]self._index += 1return resultelse:raise StopIterationdef __iter__(self):return self# 使用示例
simple_list = [1, 2, 3, 4]
iterator = SimpleIterator(simple_list)for item in iterator:print(item)

菜鸟:

我明白了,这个 SimpleIterator 通过 __next__ 方法遍历了集合中的每个元素。而 __iter__ 方法则返回了迭代器自身。

老鸟:

没错,这个就是最基础的迭代器实现。我们可以进一步扩展,让它支持更多类型的集合。

菜鸟:

那怎么扩展呢?

老鸟:

我们可以引入一个抽象的迭代器接口,然后为不同的集合类型实现不同的迭代器。

python">from abc import ABC, abstractmethodclass Iterator(ABC):@abstractmethoddef __next__(self):pass@abstractmethoddef __iter__(self):passclass ListIterator(Iterator):def __init__(self, collection):self._collection = collectionself._index = 0def __next__(self):if self._index < len(self._collection):result = self._collection[self._index]self._index += 1return resultelse:raise StopIterationdef __iter__(self):return self# 使用示例
list_collection = [1, 2, 3, 4]
list_iterator = ListIterator(list_collection)for item in list_iterator:print(item)

菜鸟:

这样做的好处是什么呢?

老鸟:

通过引入接口和具体实现,我们就可以为不同的集合类型创建不同的迭代器,而使用者只需要与迭代器接口进行交互。

问题与反思

菜鸟:

如果不用迭代器模式,我会直接在集合类中实现遍历方法,这样也能实现功能呀。

老鸟:

确实可以,但这样会导致集合类承担过多的责任,违反单一责任原则。用迭代器模式,我们可以将遍历的逻辑与集合本身分开,使代码更清晰、更易维护。

菜鸟:

我明白了,这样可以让代码更具可读性和可维护性。

优势与适用场景

老鸟:

迭代器模式有很多优势。比如,它可以让你在不修改集合类的前提下,为其添加新的遍历方式。适用于需要对集合进行多种遍历操作的场景,如树形结构、图结构等。

菜鸟:

那现实生活中有哪些常见的应用场景呢?

老鸟:

比如文件系统的遍历,社交网络中的好友关系图遍历,甚至是游戏中的场景图遍历等。

常见误区与优化建议

菜鸟:

那在使用迭代器模式时,有没有什么常见的误区需要注意?

老鸟:

一个常见误区是:有些开发者在实现迭代器时,会在迭代器中修改集合本身,这样会导致意外的副作用。建议迭代器只负责遍历,而不修改集合。

总结与延伸阅读

老鸟:

今天我们聊了迭代器模式的核心思想、基本实现以及它的优势和适用场景。希望你对迭代器模式有了更深入的理解。接下来你可以阅读《设计模式:可复用面向对象软件的基础》这本书,了解更多设计模式

菜鸟:

这次对话让我受益匪浅!我会继续学习其他设计模式,谢谢你!

老鸟:

不用客气!有问题随时来找我。


http://www.ppmy.cn/embedded/111586.html

相关文章

企业文件防泄密软件有哪些?|十款主流文件防泄密解决方案

在数据泄露事件频发的今天&#xff0c;企业对文件防泄密解决方案的需求日益增加。选择适合的文件防泄密工具对于保护敏感信息、维护企业声誉和合规性至关重要。本文将盘点十款主流文件防泄密解决方案&#xff0c;帮助企业了解各方案的特点和优势&#xff0c;从而做出明智的选择…

穿越《中国数据库前世今生》—— 一场技术与梦想的交响

目录 一、从数据库看中国IT行业的崛起 二、数据库行业的全球化趋势与本土化挑战 三、数据库技术N年变迁史 四、人工智能与大数据的融合 五、云数据库:未来的数据存储解决方案 六、深度探索数据库的世界 在数字洪流席卷全球的今天,每一行代码、每一个数据库都承载着时…

package.json中~1.0.0和^1.0.0有什么区别

~会匹配最近的小版本依赖包&#xff0c;比如~1.2.3会匹配所有1.2.0 ~ 1.2.9 版本&#xff0c;但是不包括1.3.0&#xff0c;也就是1.2.x ^会匹配最新的大版本依赖包&#xff0c;比如^1.2.3会匹配所有1.x.x的包&#xff0c;包括1.3.0&#xff0c;但是不包括2.0.0 注意 如果前面…

应用层协议 —— https

目录 http的缺点 https 安全与加密 运营商挟持 常见的加密方式 对称加密 非对称加密 数据摘要&#xff08;数据指纹&#xff09; 不安全加密策略 1 只使用对称加密 2 只使用非对称加密 3 双方都是用非对称加密 4 对称加密和非对称加密 解决方案 CA证书 http的缺点 我们可…

python-桌面软件自动化(一)(实战微信发消息)

什么是pywinauto pywinauto是一组用于自动化Microsoft Windows GUI的python模块。 最简单的是&#xff0c;它允许您将鼠标和键盘操作发送到窗口对话框和控件。 pywinauto安装和启动 1.安装pywinauto 在 Pycharm 底部的终端&#xff08;Terminal&#xff09;窗口中输入 pip …

ArcGIS Pro SDK (十四)地图探索 4 书签

ArcGIS Pro SDK (十四)地图探索 4 书签 文章目录 ArcGIS Pro SDK (十四)地图探索 4 书签1 书签1.1 使用活动地图视图创建新书签1.2 从联昌国际添加新书签1.3 获取项目的书签集合1.4 获取地图书签1.5 将书签移到顶部1.6 重命名书签1.7 删除具有给定名称的书签1.8 更改书签的…

Linux 自主 shell 编写(C 语言实现)

Linux 自主 shell 编写&#xff08;C 语言实现&#xff09; 效果主要步骤打印命令行提示符获取用户命令字符串切割用户命令字符串执行命令循环 至此源码&#xff08;简易半成品&#xff09;细节内建命令问题cd 退出码问题echo 查看退出码 完整源码makefilemyshell.c 效果 效果…

根据NVeloDocx Word模板引擎生成Word(一)

自从我们基于免费开放的E6开发平台&#xff0c;实现了根据Word模版生成Word文档的模版引擎后&#xff0c;也实实在在帮助到了一些有需要的朋友。但是由于制作Word模版的过程对于很多人会是一个很头疼的事情&#xff0c;虽然提供了详细的文档&#xff0c;但是我们也经常接到他们…

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求&#xff1a; 使用4台路由器&#xff0c;在AR1和AR4上分别配置一个LOOPBACK接口&#xff0c;根据路由的递归特性&#xff0c;写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&am…

【网络安全】服务基础第二阶段——第二节:Linux系统管理基础----Linux统计,高阶命令

目录 一、Linux高阶命令 1.1 管道符的基本原理 1.2 重定向 1.2.1 输出重定向 1.2.2 输入重定向 1.2.3 wc命令基本用法 1.3 别名 1.3.1 which命令基本语法 1.3.2 alias命令基本语法 1.4 压缩归档tar 1.4.1 第一种&#xff1a;gzip压缩 1.4.2 第二种&#xff1a;bzip…

Docker续9:使用docker-compose部署nmt项目,在haproxy中代理mysql负载均衡

为之前的docker-compose添加mysql负载均衡 [rootlocalhost pes]# rm -rf mysql/data/auto.cnf //先删除这个文件&#xff0c;这个文件保证了mysql的唯一&#xff0c;因为待会要做一个从mysql&#xff0c;所以必须删除 [rootlocalhost pes]# cp -r mysql/data mysql/data0…

【使用CPU和使用GPU的算法】

一、通常耗费 GPU 的算法 想象 GPU 是一个有很多小工人同时干活的工厂。像训练很厉害的图像识别网络、处理复杂的图形渲染以及处理大量数据的时候&#xff0c;就好比有很多相似的任务可以同时进行。比如&#xff0c;图像识别的时候要对很多像素点同时做计算&#xff0c;这就很…

大数据Flink(一百一十六):Flink SQL的时间属性

文章目录 Flink SQL的时间属性 一、Flink 三种时间属性简介 二、Flink 三种时间属性的应用场景 三、​​​​​​​SQL 指定时间属性的两种方式 四、​​​​​​​​​​​​​​SQL 处理时间DDL定义 五、​​​​​​​​​​​​​​SQL 事件时间DDL定义 Flink SQL的时…

7项国家机密被境外公司窃取!

近日&#xff0c;国家安全机关公开了一起境外公司非法搜集窃取我稀土领域国家秘密案。该公司通过利诱中方人员&#xff0c;窃取7项机密级国家秘密。 “内鬼”为51万美元泄露国家7项机密&#xff01; 该公司中方雇员叶某某在外籍员工指挥下&#xff0c;利诱收买国内某稀土公司…

基于STM32设计的水渠闸门远程控制系统(华为云IOT)(226)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…

应急响应实战---是谁修改了我的密码?

前言&#xff1a;此次应急响应为真实案例&#xff0c;客户反馈无法通过密码登录服务器&#xff0c;疑似服务器被入侵 0x01 如何找回密码&#xff1f; 客户服务器为windows server2019&#xff0c;运维平台为PVE平台&#xff1b;实际上无论是windows系统或者是linux系统&#…

语言中的溢出

任何数据类型都有最大和最小值&#xff0c;会溢出是由物理特性决定。编译型静态类型语言一般明确定义类型大小&#xff0c;这种定义出来的类型都存在溢出的可能。有的动态语言为减少程序员溢出的困扰&#xff0c;尽可能为数据扩展成更大的数值&#xff0c;Python就是这样的好人…

js 笔记

javascript编程语言 html css标记语言 html定义网页内容 css是描述网页布局 js控制网页行为 Livescript 为了确保不同浏览器上运行的javascript标准一致&#xff0c;所以几个公司共同制定了js的标准…

Modbus通信

Modbus是一种经典的工业通信协议&#xff0c;由Modicon&#xff08;现为施耐德电气&#xff09;在1979年首次发布。它广泛应用于各种工业自动化系统中&#xff0c;尤其是在PLC&#xff08;可编程逻辑控制器&#xff09;与其他设备之间的通信。Modbus的主要特点是其简单性和开放…

API 架构(RPC风格、RESTful风格)

API 架构风格笔记 RPC风格的接口案例RESTful风格的接口案例两者比对 RPC风格的接口案例 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;风格的接口设计主要关注于远程服务调用的过程&#xff0c;而不强调资源的表述。以下是RPC风格接口的一个案例…