当前位置: 首页 > news >正文

设计模式Python版 组合模式

文章目录

  • 前言
  • 一、组合模式
  • 二、组合模式实现方式
  • 三、组合模式示例
  • 四、组合模式在Django中的应用


前言

GOF设计模式分三大类:

  • 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
  • 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
  • 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

一、组合模式

组合模式(Composite Pattern)

  • 定义:组合多个对象形成树形结构以表示具有“部分—整体”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,又可以称为“部分—整体”(Part-Whole)模式。

  • 解决问题:如何使用面向对象的方式来处理软件系统中的树形结构?

  • 使用场景:

    • 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致性地对待它们。
    • 在一个使用面向对象语言开发的系统中需要处理一个树形结构。
    • 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,将来需要增加一些新的类型。
    • 在XML解析、组织结构树处理、文件系统设计等领域,组合模式都得到了广泛应用。
  • 组成:

    • 抽象构件(Component):它是所有容器类和叶子类的公共父类,为叶子构件和容器构件对象声明接口。一般将抽象构件类设计为接口或抽象类,将所有子类共有方法的声明和实现放在抽象构件类中。对于客户端而言,将针对抽象构件编程,而无须关心其具体子类是容器构件还是叶子构件。
    • 叶子构件(Leaf):代表组合结构中的叶节点对象,叶节点对象不再包含子节点。
    • 容器构件(Composite):它在组合模式结构中表示容器节点对象。容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。用列表实现容器构件
  • 补充说明

    • 组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器。客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
    • 容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。
  • 优点:

    • 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次。客户端无须关心节点的层次结构,可以对所选节点进行统一处理,提高系统的灵活性。
    • 将容器对象和叶子对象进行递归组合,实现简单,灵活性好,使用频率较高。
    • 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则。
    • 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案。
  • 缺点:

    • 在增加新构件时很难对容器中的构件类型进行限制。

二、组合模式实现方式

实现方式一:透明组合模式

  • 根据抽象构件类的定义形式,可将组合模式分为透明组合模式和安全组合模式两种形式。
  • 抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove()以及getChild()等方法
  • 透明组合模式结构图

在这里插入图片描述

实现方式二:安全组合模式

  • 抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法。
  • 安全组合模式结构图

在这里插入图片描述

三、组合模式示例

使用透明组合模式来进行杀毒软件的框架设计

  • AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFile、TextFile和VideoFile充当叶子构件类
"""抽象构件"""class AbstracFile:def add(self, file):raise NotImplementedErrordef remove(self, file):raise NotImplementedErrordef kill_virus(self):raise NotImplementedError"""容器构件"""class Folder(AbstracFile):def __init__(self, name):self.name = nameself.file_list: list[AbstracFile] = []def add(self, file):self.file_list.append(file)def remove(self, file):if file in self.file_list:self.file_list.remove(file)def kill_virus(self):# 模拟杀毒print(f"——对文件夹 {self.name} 进行杀毒")# 循环调用成员构件的业务方法for i in self.file_list:i.kill_virus()"""叶子构件"""class ImageFile(AbstracFile):def __init__(self, name):self.name = namedef kill_virus(self):# 模拟杀毒print(f"——对图像文件 {self.name} 进行杀毒")class TextFile(AbstracFile):def __init__(self, name):self.name = namedef kill_virus(self):# 模拟杀毒print(f"——对文本文件 {self.name} 进行杀毒")class VideoFile(AbstracFile):def __init__(self, name):self.name = namedef kill_virus(self):# 模拟杀毒print(f"——对视频文件 {self.name} 进行杀毒")

客户端代码

# 针对抽象构件编程
folder1 = Folder("张三的资料")
folder2 = Folder("图像文件")
folder3 = Folder("文本文件")
folder4 = Folder("视频文件")file1 = ImageFile("《洛神赋图》.gif")
file2 = ImageFile("《清明上河图》.jpg")
file3 = TextFile("《分析与设计》.txt")
file4 = TextFile("《设计模式》.doc")
file5 = VideoFile("《西游记》.rmvb")folder2.add(file1)
folder2.add(file2)
folder3.add(file3)
folder3.add(file4)
folder4.add(file5)
folder1.add(folder2)
folder1.add(folder3)
folder1.add(folder4)folder1.kill_virus()
# 也可以创建图形化界面让用户选择所需操作的根节点,无须修改源代码,符合开闭原则。
# folder2.kill_virus()

输出结果

——对文件夹 张三的资料 进行杀毒
——对文件夹 图像文件 进行杀毒
——对图像文件 《洛神赋图》.gif 进行杀毒   
——对图像文件 《清明上河图》.jpg 进行杀毒 
——对文件夹 文本文件 进行杀毒
——对文本文件 《分析与设计》.txt 进行杀毒 
——对文本文件 《设计模式》.doc 进行杀毒   
——对文件夹 视频文件 进行杀毒
——对视频文件 《西游记》.rmvb 进行杀毒  

四、组合模式在Django中的应用

Django 的 admin 界面允许用户以树形结构来组织模型。例如,一个 Group 可以包含多个 User,而 User 又可以属于多个 Group。在 admin 界面中,这种关系可以用组合模式来实现,其中 Group 可以看作是组合对象,而 User 可以看作是叶节点。

在这里插入图片描述


您正在阅读的是《设计模式Python版》专栏!关注不迷路~

相关文章:

设计模式Python版 组合模式

文章目录 前言一、组合模式二、组合模式实现方式三、组合模式示例四、组合模式在Django中的应用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式…...

dfs枚举问题

碎碎念:要开始刷算法题备战蓝桥杯了,一切的开头一定是dfs 定义 枚举问题就是咱数学上学到的,从n个数里面选m个数,有三种题型(来自Acwing) 从 1∼n 这 n个整数中随机选取任意多个,输出所有可能的选择方案。 把 1∼n这…...

【开源免费】基于SpringBoot+Vue.JS社区智慧养老监护管理平台(JAVA毕业设计)

本文项目编号 T 163 ,文末自助获取源码 \color{red}{T163,文末自助获取源码} T163,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

安全防护前置

就业概述 网络安全工程师/安全运维工程师/安全工程师 安全架构师/安全专员/研究院(数学要好) 厂商工程师(售前/售后) 系统集成工程师(所有计算机知识都要会一点) 学习目标 前言 网络安全事件 蠕虫病毒--&…...

高性能消息队列Disruptor

定义一个事件模型 之后创建一个java类来使用这个数据模型。 /* <h1>事件模型工程类&#xff0c;用于生产事件消息</h1> */ no usages public class EventMessageFactory implements EventFactory<EventMessage> { Overridepublic EventMessage newInstance(…...

kamailio中的sctp模块

以下是关于 Kamailio 配置中 enable_sctpno 的详细解释&#xff1a; 1. 参数作用 enable_sctp&#xff1a; 该参数用于控制 Kamailio 是否启用 SCTP&#xff08;Stream Control Transmission Protocol&#xff09; 协议支持。 设置为 yes&#xff1a;启用 SCTP&#xff0c;并加…...

前端学习-事件解绑,mouseover和mouseenter的区别(二十九)

目录 前言 解绑事件 语法 鼠标经过事件的区别 鼠标经过事件 示例代码 两种注册事件的区别 总结 前言 人道洛阳花似锦&#xff0c;偏我来时不逢春 解绑事件 on事件方式&#xff0c;直接使用null覆盖就可以实现事件的解绑 语法 btn.onclick function(){alert(点击了…...

独立游戏RPG回顾:高成本

刚看了某纪录片&#xff0c; 内容是rpg项目的回顾。也是这个以钱为核心话题的系列的最后一集。 对这期特别有代入感&#xff0c;因为主角是曾经的同事&#xff0c;曾经在某天晚上听过其项目组的争论。 对其这些年的起伏特别的能体会。 主角是制作人&#xff0c;在访谈中透露这…...

10.4 LangChain核心架构揭秘:模块化设计如何重塑大模型应用开发?

LangChain核心架构揭秘:模块化设计如何重塑大模型应用开发? 关键词: LangChain模块化设计、大模型开发框架、LangChain核心概念、AI应用开发、LLM工程化 一、LangChain的模块化设计哲学:从“手工作坊”到“工业化生产” 传统开发痛点: 代码重复:每个项目从零开始编写胶…...

【学习笔记】深度学习网络-正则化方法

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…...

网站快速收录:如何优化网站头部与底部信息?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/46.html 为了加快网站的收录速度&#xff0c;优化网站头部与底部信息是关键一环。以下是一些具体的优化建议&#xff1a; 网站头部信息优化 标题标签&#xff08;TitleTag&#xff09;优化…...

网络测试工具

工具介绍&#xff1a; 这是一个功能完整的网络测速工具&#xff0c;可以测试网络的下载速度、上传速度和延迟。 功能特点&#xff1a; 1. 速度测试 - 下载速度测试 - 上传速度测试 - Ping延迟测试 - 自动选择最佳服务器 2. 实时显示 - 进度条显示测试进度 - 实时显示测试状…...

使用HttpClient和HttpRequest发送HTTP请求

项目中经常会用到向第三方系统发送请求来传递数据或者获得信息&#xff0c;一般用的比较多的为HttpClient 和 HttpRequest&#xff0c;这里简要总结一下 HttpClient 和 HttpRequest 的用法 一、HttpClient 1. 发送get请求 public static String get(String url, Map<Stri…...

软件工程概论试题五

一、多选 1.好的软件的基本属性包括()。 A. 效率 B. 可依赖性和信息安全性 C. 可维护性 D.可接受性 正答&#xff1a;ABCD 2.软件工程的三要素是什么()? A. 结构化 B. 工具 C.面向对象 D.数据流! E.方法 F.过程 正答&#xff1a;BEF 3.下面中英文术语对照哪些是正确的、且是属…...

填充每个节点的下一个右侧节点指针力扣--116,117

目录 题目 思路 代码 题目 116 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针&#xff0c…...

DBUtils中QueryRunner(空参,传数据源)构造方法的区别及应用场景

关于学习Spring框架时重构DAO层时&#xff0c;遇到的QueryRunner构造方法的问题&#xff0c;回忆MySQL中DBUtils部分 1. 空参构造方法 new QueryRunner() 特点&#xff1a; 不绑定数据源&#xff1a;QueryRunner 实例内部没有 DataSource&#xff0c;因此无法自动获取连接。 …...

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…...

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…...

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…...

langchain 实现多智能体多轮对话

这里写目录标题 工具定义模型选择graph节点函数定义graph 运行 工具定义 import random from typing import Annotated, Literalfrom langchain_core.tools import tool from langchain_core.tools.base import InjectedToolCallId from langgraph.prebuilt import InjectedSt…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…...

组合模式:构建树形结构的艺术

引言:处理复杂对象结构的挑战 在软件开发中,我们常遇到需要处理部分-整体层次结构的场景: 文件系统中的文件与文件夹GUI中的容器与组件组织结构中的部门与员工菜单系统中的子菜单与菜单项组合模式正是为解决这类问题而生的设计模式。它允许我们将对象组合成树形结构来表示&…...

C++课设:实现本地留言板系统(支持留言、搜索、标签、加密等)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、项目功能概览与亮点分析1. 核心功能…...

分布式计算框架学习笔记

一、&#x1f310; 为什么需要分布式计算框架&#xff1f; 资源受限&#xff1a;单台机器 CPU/GPU 内存有限。 任务复杂&#xff1a;模型训练、数据处理、仿真并发等任务耗时严重。 并行优化&#xff1a;通过任务拆分和并行执行提升效率。 可扩展部署&#xff1a;适配从本地…...