【Python笔记-设计模式】组合模式

一、说明

组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。

(一) 解决问题

  1. 处理树形结构:可以很好地处理树形结构的数据,使得用户可以统一对待单个对象和对象组合。
  2. 统一接口:可以通过统一的接口来操作单个对象和对象组合,简化了客户端的代码。
  3. 递归组合:可以通过递归的方式来处理对象组合,使得代码更加灵活。

(二) 使用场景

  • 需要实现树状对象结构
  • 希望客户端以相同的方式处理简单和复杂元素

二、结构

  1. 组件(Component)接口描述了树中简单项目和复杂项目所共有的操作。
  2. 叶节点(Leaf)是树的基本结构,它不包含子项目。一般情况下,叶节点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分。
  3. 容器(Container)——又名 “组合 (Composite)”——是包含叶节点或其他容器等子项目的单位。容器不知道其子项目所属的具体类,它只通过通用的组件接口与其子项目交互。容器接收到请求后会将工作分配给自己的子项目,处理中间结果,然后将最终结果返回给客户端。
  4. 客户端(Client)通过组件接口与所有项目交互。因此,客户端能以相同方式与树状结构中的简单或复杂项目交互。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
组合模式例:生成具有树状结构的食品分类,并遍历输出
"""from abc import ABC, abstractmethodclass Component(ABC):"""抽象基类"""@abstractmethoddef operation(self):passclass Leaf(Component):"""叶子节点类"""def __init__(self, name):self.name = namedef operation(self, indent=""):return f"{indent}- {self.name}"class Composite(Component):"""容器节点类"""def __init__(self, name):self.name = nameself.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def operation(self, indent=""):result = [f"{indent}+ {self.name}"]for child in self.children:result.append(child.operation(indent + "  "))return "\n".join(result)if __name__ == "__main__":"""+ 食品+ 水果- 苹果- 香蕉+ 蔬菜- 西红柿- 黄瓜"""fruit = Composite("水果")fruit.add(Leaf("苹果"))fruit.add(Leaf("香蕉"))vegetable = Composite("蔬菜")vegetable.add(Leaf("西红柿"))vegetable.add(Leaf("黄瓜"))food = Composite("食品")food.add(fruit)food.add(vegetable)print(food.operation())

四、优缺点

优点

  • 开闭原则。 无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。

缺点

  • 对于功能差异较大的类,提供公共接口或许会有困难。在特定情况下,你需要过度一般化组件接口,使其变得令人难以理解。

 跳转主页:【Python笔记】设计模式-CSDN博客

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

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

相关文章

17.openEuler操作系统启动管理

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 1.系统启动流程介绍 Linux系统启动流程: POST->Bios->Grub->kernel+initrd->systemd(init)->…

C++ //练习 9.12 对于接受一个容器创建其拷贝的构造函数,和接受两个迭代器创建拷贝的构造函数,解释它们的不同。

C Primer(第5版) 练习 9.12 练习 9.12 对于接受一个容器创建其拷贝的构造函数,和接受两个迭代器创建拷贝的构造函数,解释它们的不同。 环境:Linux Ubuntu(云服务器) 工具:vim 解释…

【Elasticsearch专栏 16】深入探索:Elasticsearch的Master选举机制及其影响因素分析

Elasticsearch,作为当今最流行的开源搜索和分析引擎,以其分布式、可扩展和高可用的特性赢得了广大开发者的青睐。在Elasticsearch的分布式架构中,集群的稳健性和高可用性很大程度上依赖于其Master节点的选举机制。本文将深入剖析Elasticsearc…

Java中Date与LocalDate、LocalDateTime之间的区别及相互转换

前言 在Java开发过程中,处理日期和时间是常见的需求。随着Java 8引入了全新的日期/时间API,原有的java.util.Date类逐渐被java.time包中的LocalDate和LocalDateTime等类所替代。本文将详细阐述这三个类之间的主要区别以及它们之间的相互转换。 1. 类型…

【计算机网络】1.4 接入网和物理媒体

1.4 接入网和物理媒体 问题:怎样将端系统和边缘路由器连接? 答:有线方式(住宅接入网络、单位接入网络等)或无线方式(无线接入网络)。 有线接入方式 光纤同轴混合网是基于已有的有线电视网开发的…

python Matplotlib Tkinter-->最终框架一

3D雷达上位机实例(能够通过点击柱状图来展示3D雷达数据)2024.2.26 环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk impor…

EEA架构

概念 EEA(Electrical/Electronic Architecture)是一个综合性的概念,它涉及汽车电子电气系统的设计和整合。EEA是汽车上电气部件之间的相互关系,以及包含所有电气部件和电气系统所承载的逻辑功能的组织结构。它是系统的组织结构表…

《Docker 简易速速上手小册》第9章 Docker 与持续集成(2024 最新版)

文章目录 9.1 持续集成的基本概念9.1.1 重点基础知识9.1.2 重点案例:Python Web 应用的 CI 流程9.1.3 拓展案例 1:Python 数据分析项目的 CI9.1.4 拓展案例 2:Python 微服务的 CI/CD 9.2 Docker 在 CI/CD 中的应用9.2.1 重点基础知识9.2.2 重…

287.【华为OD机试真题】字符串序列判定(贪心算法—JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-字符串序列判定二.解题思路三.题解代码Python题…

【重点】需求分析的每个维度和内容

1. 功能性需求 定义:功能性需求定义了系统或产品应该提供哪些核心功能和操作。 内容: 用户界面(UI):描述用户如何与系统交互,包括按钮、菜单、对话框等。用户交互(UX):描述用户与系统交互的流程,如注册、登录、搜索等。数据管理:描述系统如何存储、处理和检索数据。业…

关于使用Mxnet GPU版本运行DeepAR报错解决方案

1.引言 我们经常使用GPU来训练和部署神经网络,因为与CPU相比,它提供了更多的计算能力。在本教程中,我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先,确保您的机器中至少有一个Nvidia GPU,并正确安装了CUDA以及CUDN…

C++动态链接库;C++链接库链接到C#上

1.在创建项目中选择动态链接库,如果没有可以从右侧搜索,如果还没有重新安装安装包点击修复增加相应功能 2.点击下一步,可以修改项目名称和目录位置点击创建完成项目创建 3.在新建项目内添加新的头文件(.h),…

modbus-tcp协议详解

本文参考:Modbus协议中文版【完整版】.pdf,加上自己的理解的记录,该文章主要讲modbus-TCP协议。(文档下载链接:【免费】modbus协议中文详细解释文档资源-CSDN文库) 本系列文章分为三章: 1.mod…

编程笔记 html5cssjs 086 JavaScript 内置对象

编程笔记 html5&css&js 086 JavaScript 内置对象 一、Object二、Array三、String四、Number五、Math六、Date七、RegExp八、Function九、示例小结 JavaScript 内置对象是 JavaScript 语言本身定义的一系列预定义的对象,这些对象在全局作用域中可以直接使用&…

Cubase学习:Cubase 12常用快捷键

按键盘上的上下箭头就可以让选中的音符向上或向下移动 数字0键: 停止 Ctrl+数字 0 键: 新建视图层 Alt+数字0 键: 重新设置视图层 小数点键: 播放指针回零点 数字1 键: 左定位指针 数字 2 键: 右定位指针 数字3 键--数字9键: 分别控制 3--9 的7个定位标志 Alt+数字1 键--数字9键…

HuggingFists系统功能介绍(5)--环境资源

模型库 模型库用于管理由HuggingFists系统自己生成的或者外部导入的各种模型。如:HuggingFace网站提供的各类模型可导入该模块进行统一管理及部署。该功能目前在HuggingFists的社区版中并未提供。 环境管理 环境管理-工作节点 环境管理-服务配置 环境管理主要用于与…

protobuf简单使用(二)

介绍 上一节中,我们介绍了protobuf,简单来说,它是一种消息数据格式,其作用类似于json,但是比json的使用效率要高。 除此以外,我们介绍了protobuf的简单使用,也就是如何可以像使用json一样&…

2627. 函数防抖

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 请你编写一个函数,接收参数为另一个函数和一个以毫秒为单位的时间 t &#xff0…

Linux之vim的使用详细解析

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.vim简介 二.vim的基本概念 三.vim的基本操作 3.1准备 …

DrawIO常用模版

其他 - 编辑绘图 泳道图 多级审批流程 <mxGraphModel dx="1298" dy="744" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1…