【python设计模式】10、组合模式
哲学思想
组合模式是一种设计模式,用于将对象组合成树形结构以表示部分-整体层次结构。该模式允许客户端统一处理单个对象和对象组合。
从哲学的角度来看,组合模式可以被视为关于整体和部分之间关系的哲学思想。在这个模式中,整体和部分之间的关系是递归的。每个部分本身也可以是整体,由更小的部分组成。
这种递归关系与许多哲学观点和概念相似,例如系统思维、生态学和辩证法。在这些领域中,整体和部分之间的关系也是递归的,每个部分都可以是整体,由更小的部分组成。
组合模式的哲学思想强调整体和部分之间的相互依存关系。这种依存关系可以被视为一个系统或生态系统的特征,其中每个组件都对整体产生影响。通过理解这种递归关系,我们可以更好地理解复杂的系统和生态系统,以及如何在这些系统中进行有效的设计和管理。
简介:
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树状结构,并且能够像处理单个对象一样处理组合对象和单个对象。
组合模式由两种类型的对象组成:叶子节点和容器节点。叶子节点表示树状结构中的最终节点,而容器节点则表示包含其他节点的节点。容器节点可以是叶子节点或其他容器节点的父节点,从而形成一个树状结构。
组合模式通过让所有节点实现相同的接口来实现透明性,即使是容器节点也可以像叶子节点一样被处理。这使得客户端代码可以忽略对象的具体类型而直接操作对象。
组合模式的优点包括简化代码结构、增强代码可扩展性和可维护性、提高代码复用性等。适用于需要处理树形结构数据的应用场景,如组织结构、文件系统、图形用户界面等。
优点:
-
简化代码结构:通过将对象组合成树状结构,可以避免使用大量的if/else或switch语句来处理不同的对象类型,从而简化了代码结构。
-
增强代码可扩展性和可维护性:当需要添加新的节点类型时,只需要创建新的类实现相同的接口即可,而不需要修改现有的代码。这样可以增强代码的可扩展性和可维护性。
-
提高代码复用性:由于所有节点实现相同的接口,因此可以在不同的组合中重复使用相同的节点。
-
可以透明地处理组合对象和单个对象:客户端代码可以像处理单个对象一样处理组合对象和单个对象,无需关心对象的具体类型,从而实现了透明性。
-
可以提高代码的灵活性:由于组合模式中的对象都实现相同的接口,因此可以灵活地组合不同的对象实现不同的功能。
缺点:
-
可能会导致设计过度复杂:当对象层次结构较为复杂时,使用组合模式可能会导致设计过度复杂,从而增加代码的维护成本。
-
可能会影响性能:由于组合模式需要遍历整个对象树才能执行某些操作,因此可能会影响程序的性能。
-
可能会限制对象的类型:由于组合模式要求所有节点实现相同的接口,因此可能会限制对象的类型。如果某些节点需要特定的方法或属性,则需要在接口中定义这些方法或属性,从而增加了接口的复杂度。
实际应用场景:
-
组织结构:组合模式可以用于表示公司的组织结构,将公司分成多个部门,每个部门又包含多个小组,每个小组又包含多个员工。
-
文件系统:组合模式可以用于表示文件系统的层次结构,将文件系统分成多个文件夹,每个文件夹又包含多个子文件夹和文件。
-
图形用户界面:组合模式可以用于表示图形用户界面中的控件层次结构,将界面分成多个面板,每个面板又包含多个子控件。
-
产品配置:组合模式可以用于表示产品配置的层次结构,将产品分成多个组件,每个组件又包含多个子组件。
-
电子商务:组合模式可以用于表示电子商务网站中的商品分类,将商品分成多个分类,每个分类又包含多个子分类和商品。
代码实现:
from abc import ABC, abstractmethodclass Component(ABC):@abstractmethoddef operation(self):passclass Composite(Component):def __init__(self):self.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def operation(self):for child in self.children:child.operation()class Leaf(Component):def operation(self):print("Leaf operation")# 创建一个组合对象,并向其中添加两个叶子对象
composite = Composite()
composite.add(Leaf())
composite.add(Leaf())# 调用组合对象的操作方法
composite.operation()
在这个例子中,我们定义了两个类:Component和Composite,其中Component是组合中所有对象的基类,Composite是一个组合对象,包含多个Component对象。Composite对象具有添加和移除子组件的方法,并且可以遍历其所有子组件,并调用它们的操作方法。
另外,我们还定义了一个Leaf类,表示组合中的叶子对象。Leaf类实现了Component接口的操作方法。
在主程序中,我们创建了一个组合对象,并向其中添加两个叶子对象。然后调用组合对象的操作方法,这样所有子组件的操作方法都将被调用。
需要注意的是,这只是一个简单的示例,实际应用中可能会有更多的对象和方法。同时,我们也可以根据具体需求进行更多的扩展和定制。
相关文章:
【python设计模式】10、组合模式
哲学思想 组合模式是一种设计模式,用于将对象组合成树形结构以表示部分-整体层次结构。该模式允许客户端统一处理单个对象和对象组合。 从哲学的角度来看,组合模式可以被视为关于整体和部分之间关系的哲学思想。在这个模式中,整体和部分之间…...
实验五 网络安全加固
目录 一、实验内容 二、实验环境 三、实验步骤 一、实验内容 在GRE VPN实验基础上,对网络进行安全加固。 1、在S0上配置端口安全,设置服务器端口MAC绑定、限制端口MAC连接数量为1,超过最大值则丢弃数据帧。 2、配置OSPF路由协议认证。 3…...
MongoDB综述【入门指南】
写这篇博客,正好是2023年4月5日15:29:31,是清明节,放假一天,我坐在我的小小租房室内,思考着没思考到啥,哈哈哈,感觉好着急啊!看完了一本《城南旧事》,但是就是不踏实,好吧~我来写一篇最近在学的一个技术 为了更优秀的自己~奥利给!! 首先,我们从最初级小白开始(因为自己也是小白…...
Python 3 备忘清单_开发速查表分享
Python 3 备忘清单 Python 3开发速查备忘单是 Python 3 编程语言的单页参考表入门,为开发人员分享快速参考备忘单。 开发速查表大纲 入门 介绍 Hello World 变量 数据类型 Slicing String Lists If Else 循环 函数 文件处理 算术 加等于 f-字符串(Python 3.6) P…...
Thinkphp 6.0模版的加载包含输出
本节课我们来学习一下模版标签中的文件的包含、输出以及加载。 一.包含文件 1. 使用{include}标签来加载公用重复的文件,比如头部、尾部和导航部分; 2. 在模版 view 目录创建一个 public 公共目录,分别创建 header、footer 和 nav…...
ROS实践11 自定义头文件并调用
文章目录运行环境:思路:1.1 编写头文件1.2 includepath添加头文件路径1.3 编写可执行文件1.4 配置文件1.5 编译运行运行环境: ubuntu20.04 noetic 宏基暗影骑士笔记本 思路: 类和函数: 头文件 声明 可执行文件 定义…...
一位年薪35W的测试被开除,回怼的一番话,令人沉思
一位年薪35W测试工程师被开除回怼道:“反正我有技术,在哪不一样” 一技傍身,万事不愁,当我们掌握了一技之长后,在职场上说话就硬气了许多,不用担心被炒,反过来还可以炒了老板,这一点…...
【Docker】Docker常用命令
帮助启动类命令 启动docker systemctl start docker停止docker systemctl stop docker重启docker systemctl restart docker查看docker状态 systemctl status docker[root192 ~]# systemctl status docker ● docker.service - Docker Application Container EngineLoaded…...
【linux基础】7.linux系统自定义应用名和应用图标
"懦弱之人毫无价值"1. 做应用和图标1.1.测试和加入侧边栏3. 命令行重命名唤醒任务叙述:有一个x.sh文件可以在命令行执行,sh x.sh,这样太麻烦。 将其做成app且配上logo,下次直接点击使用将其路径全名重命名,可以直接用重…...
10.网络爬虫—MongoDB详讲与实战
网络爬虫—MongoDB详讲与实战MongoDBMongoDB安装创建数据目录1.数据库操作2.集合操作3.文档操作4.索引操作5.聚合操作6.备份与恢复MongoDB增删改查mongodb集合的增删改查数据插入到表数据的查看删除数据更新数据PyMongo连接数据库第二步 选择需要使用的数据库和集合PyMongo增删…...
C4D -> Three.js资产制作与导入流程
这篇文章介绍从 Cinema 4D 中的 UV 模型到用于 Three.js 的 .glb/.gltf 资产和纹理的整个过程,该网格将依赖 MeshStandardMaterial 来复制你在 Redshift 中看到的内容, 没有由 Three.js 处理的任何照明。 推荐:用 NSDT场景设计器 快速搭建3D场…...
【博学谷学习记录】大数据课程-学习十三周总结
Hive的交互方式 第一种交互方式:bin/hive hive 创建一个数据库 create database mytest; show databases; 第二种交互方式:使用sql语句或者sql脚本进行交互 不进入hive的客户端直接执行hive的hql语句 hive -e “create database mytest2” 或者我们…...
Spring Cloud快速入门
文章目录Spring Cloud快速入门一、基础概念1、微服务架构2、微服务技术栈3、什么是Spring Cloud?4、Spring Cloud和Spring Boot的联系?5、比较成熟的互联网架构二、Rest环境搭建1、搭建提供者1.1、创建一个父工程1.2、创建一个springcloud-api模块1.3、创建一个spr…...
论文学习——VideoGPT
论文学习——VideoGPT: Video Generation using VQ-VAE and Transformers 原文链接:https://arxiv.org/abs/2104.10157 1. 设计思路 不同种类的生成模型在一下多个维度各有权衡:采样速度、样本多样性、样本质量、优化稳定性、计算需求、评估难易程度等…...
Flutter系列(五)底部导航详解
Flutter系列(四)底部导航顶部导航图文列表完整代码,如下: Flutter系列(四)底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 目录 一、前言 二、Scaffold组件 三、BottomNavigationBar组件 …...
『pyqt5 从0基础开始项目实战』02. 页面布局设计(保姆级图文)
目录弹性布局介绍导包和框架代码布局框架搭建1. 总体布局框架2. 顶部菜单布局3. form添加内容布局4. table数据展示布局5. footer底部菜单完整项目代码总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏,持续更新中 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&am…...
【Python机器学习】——平均中位数模式
Python机器学习——平均中位数模式 文章目录 Python机器学习——平均中位数模式一、Python 平均中位数模式一、Python 平均中位数模式 均值、中值和众数 从一组数字中我们可以学到什么? 在机器学习(和数学)中,通常存在三中我们感兴趣的值: 均值(Mean) - 平均值 中值(M…...
Windows窗口
Windows窗口 Unit01注册窗口类 01窗口类的概念 窗口类是包括了窗口的各种参数信息的数据结构每个窗口都具有窗口类,基于窗口类创建窗口每个窗口都具有一个名称,使用前必须注册到系统 02窗口类的分类 系统窗口类 系统已经定义好的窗口类,…...
Spring Transaction 源码解读
Spring Transaction 规范的maven坐标如下: <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>...</version></dependency>该包提供了spring事务规范和默认的jta(ja…...
[Netty] Channel和ChannelFuture和ChannelFutureListener (六)
文章目录1.Channel介绍2.ChannelFuture接口介绍3.GenericFutureListener接口介绍1.Channel介绍 NIO的Channel与Netty的Channel 不一样 Netty重新设计了Channel接口,并且给予了很多不同的实现, Channel是Netty网络的抽象类, 除了NIO中Channel所包含的网络I/O操作, 主动建立和关…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
