【Python笔记-设计模式】迭代器模式

一、说明

迭代器模式是一种行为设计模式,让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。

(一) 解决问题

遍历聚合对象中的元素,而不需要暴露该对象的内部表示

(二) 使用场景

  • 需要对聚合对象中元素进行遍历,并且不想暴露其内部结构
  • 减少程序中重复的遍历代码时
  • 能够遍历不同的甚至是无法预知的数据结构时

二、结构

  1. 迭代器(Iterator)接口声明了遍历集合所需的操作:获取下一个元素、获取当前位置和重新开始迭代等。
  2. 具体迭代器(ConcreteIterators)实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度。这使得多个迭代器可以相互独立地遍历同一集合。
  3. 集合(Collection)接口声明一个或多个方法来获取与集合兼容的迭代器。请注意,返回方法的类型必须被声明为迭代器接口,因此具体集合可以返回各种不同种类的迭代器。
  4. 具体集合(ConcreteCollections)会在客户端请求迭代器时返回一个特定的具体迭代器类实体。你可能会琢磨,剩下的集合代码在什么地方呢?不用担心,它也会在同一个类中。只是这些细节对于实际模式来说并不重要,所以我们将其省略了而已。
  5. 客户端(Client)通过集合和迭代器的接口与两者进行交互。这样一来客户端无需与具体类进行耦合,允许同一客户端代码使用各种不同的集合和迭代器。客户端通常不会自行创建迭代器,而是会从集合中获取。但在特定情况下,客户端可以直接创建一个迭代器(例如当客户端需要自定义特殊迭代器时)。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
迭代器模式例:迭代树结构对象
"""from collections.abc import Iterable, Iteratorclass TreeNode:"""树节点类"""def __init__(self, value):self.value = valueself.children = []def add_child(self, child):self.children.append(child)def __str__(self, level=0):indent = " " * levelresult = f"{indent}{self.value}\n"for child in self.children:result += child.__str__(level + 4)return resultclass Tree(Iterable):"""聚合对象"""def __init__(self, root):self.root = rootdef __iter__(self) -> Iterator:return TreeIterator(self.root)class TreeIterator(Iterator):"""迭代器"""def __init__(self, node):self.stack = [node]def __next__(self):if not self.stack:raise StopIterationnode = self.stack.pop()self.stack.extend(reversed(node.children))return node.valueif __name__ == "__main__":"""ABDECF"""# 构建树形结构root = TreeNode("A")b = TreeNode("B")c = TreeNode("C")d = TreeNode("D")e = TreeNode("E")f = TreeNode("F")root.add_child(b)root.add_child(c)b.add_child(d)b.add_child(e)c.add_child(f)# 遍历树形结构tree = Tree(root)for value in tree:print(value)

四、优缺点

优点

  • 简化了聚合对象的接口:迭代器模式将遍历集合元素的责任分离出来,使得聚合对象和迭代器对象的职责更加清晰,聚合对象只需提供迭代器而无需关注遍历逻辑。
  • 隐藏了集合的内部结构:迭代器模式封装了集合的内部实现细节,使得客户端可以透明地访问集合元素,而不必关心集合的具体实现方式。

缺点

  • 不适合过于简单的集合:对于结构简单、元素数量少的集合,不如直接遍历集合来得简单直接。

【Python笔记】设计模式-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502427.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络攻防之CVE-2020-15778漏洞的复现及修复详细过程

目录 漏洞描述 实验环境 漏洞复现 漏洞修复 漏洞扩展 漏洞描述 (1)漏洞编号:CVE-2020-15778 (2)CVE官网对该漏洞的解释 (3)漏洞简介:2020年6月9日,研究人员Chinmay Pandya在Openssh中发现了一个漏洞,于7月18日公开。OpenSSH的8.3p1中的scp允许在scp.c远程功能中注入命…

软考-系统集成项目管理中级-信息系统建设与设计

本章重点考点 1.信息系统的生命周期 信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等。信息系统的生命周期可以分为四个阶段:立项、开发、运维和消亡。 2.信息系统开发方法 信息系统常用的开发方法有结构化方法、原型法、面向对象方法等 1)结构化方法 …

Amino PEG11 COOH,Amino-PEG11-acid,可在活化剂存在下与氨基反应

您好,欢迎来到新研之家 文章关键词:1616426-12-0,Amino-PEG11-acid,Amino PEG11 COOH,H2N-PEG11-CH2CH2COOH,氨基-PEG11-羧酸 一、基本信息 【产品简介】:Amino-PEG11 acid is a heterobifun…

拦截器Interceptor(黑马学习笔记)

学习完了过滤器Filter之后,接下来我们继续学习拦截器Interceptor。 拦截器我们主要分为三个方面进行讲解: 1.介绍下什么是拦截器,并通过快速入门程序上手拦截器 2.拦截器的使用细节 3.通过拦截器Interceptor完成登录校验功能 我们先学习第一…

【Flink入门修炼】2-1 Flink 四大基石

前一章我们对 Flink 进行了总体的介绍。对 Flink 是什么、能做什么、入门 demo、架构等进行了讲解。 本章我们将学习 Flink 重点概念、核心特性等。 本篇对 Flink 四大基石进行概括介绍,是 Flink 中非常关键的四个内容。 一、四大基石 Flink四大基石分别是&#x…

ShardingJdbc实战-分库分表

文章目录 基本配置分库分表的分片策略一、inline 行表达时分片策略algorithm-expression行表达式完整案例和配置如下 二、根据实时间日期 - 按照标准规则分库分表标准分片 - Standard完整案例和配置如下 基本配置 逻辑表 逻辑表是指:水平拆分的数据库或者数据表的相…

Windows11服务器远程连接错误:错误代码0x3,不重启服务器的解决方法

问题描述 在连接远程服务器时,发现如下错误: 您的远程桌面会话已结束,可能是下列原因之一: 管理员已结束了会话 在建立连接时发生错误。 发生网络问题 展开详细信息后发现错误代码0x3,如下图: 但之前都能…

安卓开发4-MQTT环境搭建

安卓开发4-MQTT环境搭建 1.搭建好安卓环境 略 2.打开一个已经创建好的工程&#xff0c;分别修改下面3个文件 2.1.AndroidManifest.xml 添加权限 <uses-permission android:name"android.permission.INTERNET" /><uses-permission android:name"and…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

MyBatis 学习(五)之 高级映射

目录 1 association 和 collection 介绍 2 案例分析 3 一对一关联和一对多关联 4 参考文档 1 association 和 collection 介绍 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 标签&#xff0c;这两个标签是用来关联查询的&#xff0c;它们的属…

视频在线压缩

video2edit 一款免费的在线视频编辑软件&#xff0c;可以进行视频合并、视频剪辑、视频压缩以及转换视频格式等。 链接地址&#xff1a;在线视频编辑器和转换器 - 编辑&#xff0c;转换和压缩视频文件 打开视频压缩页面&#xff0c;上传想要压缩视频&#xff0c;支持MP4&…

【前端素材】推荐优质在线电影院商城电商网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上浏览电影资源、租借或购买电影&#xff0c;以及观看在线影片。 2、功能需求 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上…