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

news2024/12/23 11:50:46

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

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

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
组合模式

例:生成具有树状结构的食品分类,并遍历输出
"""

from abc import ABC, abstractmethod


class Component(ABC):
    """抽象基类"""

    @abstractmethod
    def operation(self):
        pass


class Leaf(Component):
    """叶子节点类"""

    def __init__(self, name):
        self.name = name

    def operation(self, indent=""):
        return f"{indent}- {self.name}"


class Composite(Component):
    """容器节点类"""

    def __init__(self, name):
        self.name = name
        self.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.coloradmin.cn/o/1466003.html

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

相关文章

【LeetCode每日一题】 单调栈的案例 42. 接雨水

这道题是困难,但是可以使用单调栈,非常简洁通俗。 关于单调栈可以参考单调栈总结以及Leetcode案例解读与复盘 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 …

2 物理层(五):传输介质

目录 1 传输介质1.1 有线传输媒体1、双绞线2、同轴电缆3、光纤 1.2 无线传输媒体1、无线电波段分配2、微波通信3、卫星通信4、红外通信和激光通信 1 传输介质 物理层传输的二进制比特流需要在传输介质上实现。传输介质是数据传输的物理通道,它还能连接主机和各种网…

【JAVA】中的静态代理、动态代理以及CGLIB动态代理

目录 1.静态代理 2.动态代理 3.cglib代理 代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于java的代理模式,一般可分为:静态代理、动态代理、以及CGLIB实现动态代理。 对于上述三种代理模式,分别进行…

Kubernetes 二进制部署 《easzlab / kubeasz项目部署》(一)

Kubernetes 二进制部署 - easzlab / kubeasz项目部署 1. 准备工作1.1 设置防火墙1.2 设置SeLinux1.3 设置时区及时间同步1.4 配置域名解析1.5 确认SSH开启1.6 IP转发1.7 安装docker1.8 关闭swap 2. 服务器规划2.1 基本架构图2.2 官方建议2.3 实践服务器规划 3. 服务器配置3.1 配…

基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真.mppt采用爬山法实现,仿真输出MPPT控制效果,功率,转速等。 2.系统仿真结果 …

SQL注入漏洞解析--less-2

首先我们进入第二关 思路: 1.先判断是什么类型的注入 2.根据类型我们在找注入点 步骤: 1.提示我们输入id数字,那我们先输入1猜一下 2.这里正常回显,当我们后边加上时可以看到报错,且报错信息看不到数字&#xff0…

Go 中如何高效遍历目录?探索几种方法

嗨,大家好!我是波罗学。本文是系列文章 Go 技巧第十八篇,系列文章查看:Go 语言技巧。 目录遍历是一个很常见的操作,它的使用场景有如文件目录查看(最典型的应用如 ls 命令)、文件系统清理、日志…

知识积累(二):损失函数正则化与权重衰减

文章目录 1. 欧氏距离与L2范数1.1 常用的相似性度量 2. 什么是正则化?参考资料 本文只介绍 L2 正则化。 1. 欧氏距离与L2范数 欧氏距离也就是L2范数 1.1 常用的相似性度量 1)点积 2)余弦相似度 3)L1和L2 2. 什么是正则化&…

游戏史上五个定价最高的量产型游戏机

你买过微软和索尼的下一代游戏机PS5和XBOX吗? PS5光驱版售价499美元,无光驱版售价399美元,高端版售价499美元,入门版售价低至299美元。 对于这样的定价,你觉得贵还是便宜呢? 为什么不让我们垂直比较整个游戏…

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。   ​  数据可视化主要目…

【论文精读】IBOT

摘要 掩码语言建模(MLM)是一种流行的语言模型预训练范式,在nlp领域取得了巨大的成功。然而,它对视觉Transformer (ViT)的潜力尚未得到充分开发。为在视觉领域延续MLM的成功,故而探索掩码图像建模(MIM),以训练更好的视觉transforme…

ico图片怎么制作(图片怎么变成ico格式)

ico图片一般命名为favicon.ico,主要用于作为缩略的网站标志,显示在浏览器的地址栏或者在标签中,一般用网站logo来制作。那么ico图片怎么制作?Logo图片怎么变成ico格式?下面boke112百科就跟大家说一说ico图片制作步骤&a…

【C++】——模板初阶 | STL简介

前言: 模板初阶 | STL简介 文章目录 一、模板初阶1.1 函数模板1.2 类模板 二、STL简介 (了解) 一、模板初阶 泛式编程(Generic Programming)指的是一种编程范式,其核心思想是编写可以在不同数据类型上通用的代码&#…

真的是性能优化(压测)-纯思想

文章目录 概要优化指标-MD都是文字看看就行性能优化操作1、代码优化:2、系统配置与环境优化:3、架构与设计:4、~~实施与监控:~~5、~~开发流程和环境管理:~~ 总结 概要 性能优化是一个持续的过程,需要监控、…

如何管理Windows Server磁盘分区?

Windows Server系统内置的分区软件有哪些? 系统内置的Windows Server分区管理软件主要分为两个——磁盘管理工具和Diskpart命令。其中磁盘管理工具可以帮助人们进行基础的磁盘、分区或卷管理任务,Diskpart命令则是在命令提示符中使用命令行来管理磁盘分…

如何将新标注的三元组数据转换成unicoqe可以处理的格式

目录 问题描述: 问题解决: 问题描述: 原始的标注的三元组格式如下: 需要转换的格式如下: tips:有一个小的难点: 1. 针对多三元组的情况,需要额外考虑 2. 最后一个样本,也记得需要处理

QEMU之CPU虚拟化

概述 KVM是由以色列初创公司Qumranet在CPU推出硬件虚拟化之后开发的一个基于内核的虚拟机监控器。 KVM是一个虚拟化的统称方案,除了x86外,ARM等其他架构也有自己的方案,所以KVM的主体代码位于内核树virt/kvm目录下面,表示所有CP…

JUC并发编程最新面试题(持续更新)

JUC并发编程 1 并发编程的优缺点为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU 的计算能力发挥到极致,性能得到提升方便进行业务拆分,提升系统并发能力和性能&a…

服务器被黑该如何查找入侵痕迹以及如何防御攻击

当公司的网站服务器被黑,被入侵导致整个网站,以及业务系统瘫痪,给企业带来的损失无法估量,但是当发生服务器被攻击的情况,作为服务器的维护人员应当在第一时间做好安全响应,对服务器以及网站应以最快的时间…

深入了解Git

1.1 Git 的工作流程简介 克隆 Git 资源作为工作目录 在克隆的资源上添加或修改文件 如果其他人修改了,你可以更新资源 在提交前查看修改 提交修改 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交 1.2 Git 工作区、暂存区和版…