9、设计模式之组合模式(Composite)

一、什么是组合模式
组合模式也成为整体部分模式,是一种结构型设计模式。它将对象组合成树形的层次结构,用来表示“整体-部分”的关系。通过组合模式,我们可以使用相同的方式处理单个对象和多个对象组合。

二、角色组成

组件(Component):定义组合模式中所有对象共有的方法和属性。
叶子节点(Leaf):叶子节点对象,也是组合中没有子节点的对象。
组合节点(Composite):表示组合中的容器对象,该对象包含其他子节点。

三、优缺点
优点:

通过组合模式,可以使客户端统一处理单个对象和组合对象,并且不用区分类型,简化了客户端代码的复杂性。
在无需修改现有的代码情况下,可以很容易地增减新的组件类型,更加灵活。
组合对象和单个对象之间的一致性接口可以使代码更易复用
缺点:

可能限制组件的类型:组合模式要求组件和叶子节点具有相同的接口,这可能会限制组件的类型。例如,所有的组件都必须实现相同的操作,即使某些组件并不需要这些操作。
对某些操作的不支持:在组合模式中,对于某些操作,可能只有叶子节点能够支持,而组合对象不能够支持。这可能需要在设计时进行权衡。
可能增加系统复杂性:虽然组合模式可以简化客户端代码,但在另一方面,它也引入了新的类和关系,可能增加了系统的复杂性。在一些简单的情况下,使用组合模式可能会显得过于繁琐。
四、应用场景
4.1 生活场景
古代皇帝:皇帝治理国家不可能具体到某一个人,所以设置了很多机构,比如三省六部,这些机构下面又有很多小的组织,它们共同治理这个国家。
公司:一个公司下面有很多小部门,每个部门下面又分好几个组,有可能再细点每个组又分为职业不同的人(前端、测试、开发、运维)。
文件:比如C盘、D盘下面有很多文件夹,文件夹里面又有很多文件或文件夹。
4.2 java场景

HashMap:putAll()传入的是Map对象,Map就是一个组件,而HashMap就是一个组合节点,HashMap中的Node节点就是叶子节点。同理,ArrayList对象也有addAll()方法。
Java AWT和SWING:对于Button和Checkbox是叶子节点,Container是组合节点。

五、代码实现
下面以算数表达式为例,解释一下组合模式。我们可以把算数表达式看作是一个树状结构,由操作符和操作数组成。

组件(Component):Expression
叶子节点(Leaf):AddOperator、MulOperator、Number
组合节点(Composite):Operator

5.0 UML类图
在这里插入图片描述
5.1 Expression-组件(Component)

/**
 * 
 * 1.组件(Component):算数表达式
 */
public interface Expression {
 
    //求值
    double evaluate();
}

5.2 Number-叶子节点(Leaf)

/**
 * 
 * 2.叶子节点(Leaf):数字
 */
public class Number implements Expression{
    private double val;
    public Number(double v){
        this.val=v;
    }
 
    @Override
    public double evaluate() {
        return val;
    }
}

/**
 * 
 * 2.叶子节点(Leaf):加法操作符
 */
public class AddOperator extends Operator{
    public AddOperator(Expression left, Expression right) {
        super(left, right);
    }
 
    @Override
    public double evaluate() {
        return left.evaluate() + right.evaluate();
    }
}
/**
 * 
 * 2.叶子节点(Leaf):加法操作符
 */
public class MulOperator extends Operator{
    public MulOperator(Expression left, Expression right) {
        super(left, right);
    }
 
    @Override
    public double evaluate() {
        return left.evaluate() * right.evaluate();
    }
}

5.3 Operation-组合节点(Composite)

/**
 * 
 * 2.组合节点(Composite):运算
 */
public abstract class Operator implements Expression{
    protected Expression left;
    protected Expression right;
 
    public Operator(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
//    @Override
//    public double evaluate(){
//        return 0;
//    }
}

5.4 testComposite

/**
 * 
 * 组合模式测试类
 */
@SpringBootTest
public class TestComposite {
   @Test
    void testComposite(){
        // 构建一个算数表达式: (2 + 3) * 4
        Expression expression = new MulOperator(
                new AddOperator(new Number(2), new Number(3)),
                new Number(4)
        );
        // 计算表达式的结果
        double result = expression.evaluate();
        System.out.println("(2+3)*4=" + result);
    }
}

六、总结
组合模式通过把叶子节点当成特殊的组合节点来看待,从而对叶子节点和组合节点能用相同的方式处理,下面总结一下组合模式在程序设计中的使用场景:

对象的层次结构:当你有一组对象,这些对象可以以层次结构的方式进行组织时,组合模式非常有用。例如,文件系统中的文件和文件夹、组织架构中的部门和员工等。
统一处理对象:当你希望能够以统一的方式处理一组对象时,组合模式可以派上用场。组合模式会将叶子对象和组合对象统一对待,这样你就可以通过递归遍历整个对象树,从而对每个对象进行相同的操作。
部分-整体关系:组合模式非常适用于表示部分-整体关系的情况。你可以将单个对象视为整体,将多个对象组合成部分,然后再将多个部分组合成更大的整体,以此类推。
可以忽略对象的具体类型:通过使用组合模式,你可以忽略对象的具体类型,只处理对象的共同接口。这样可以简化代码,使其更加灵活、可扩展和易于维护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity URP 如何写基础的几何着色器

这是使用几何着色器在点中心生成一个点并根据这个点把原本的面片分成三个三角形的操作。 对于几何着色器构造相对简单,网上的信息也相对较多,需要注意的点就是需要提供一个新的数据结构供几何着色器输出,因为几何着色器在顶点之后&#xff0…

properties文件和yml文件的区别以及文件优先级

properties文件和yml文件的区别 yml是按照缩进关系,而properties用"."来表示关系springboot默认生成的是properties文件当properties文件和yml文件都存在时,properties文件的优先级更高。 properties文件的样式 yml文件的样式 文件优先级 r…

使用 Jenkins 和 Spinnaker 构建 Kubernetes CI/CD

无论您是新手还是持续集成和持续交付以及容器化领域的经验丰富,本文都将为您提供设置 Spinnaker 以满足您的软件应用程序交付需求的基本知识。 了解 Jenkins、Spinnaker 和 Kubernetes Kubernetes 和 Jenkins 是两个强大的工具,它们相互配合&#xff0…

新加坡大带宽服务器托管优势

在数字化快速发展的今天,服务器托管成为企业拓展业务、提高服务质量的关键环节。而新加坡作为一个国际性的金融、贸易和科技创新中心,其大带宽服务器托管服务在全球范围内享有盛誉。本文将为您科普新加坡大带宽服务器托管的诸多优势。 首先,新…

第十五届蓝桥杯(Web 应用开发)模拟赛 3 期-大学组(被题目描述坑惨了)

目录 1.创意广告牌 2.原子化css 3.神秘咒语 4.朋友圈 5.美食蛋白揭秘 6.营业状态变更 7.小说阅读器 8.冰岛人 9.这是一个”浏览器“ 10.趣味加密解密 总结 1.创意广告牌 这个题目不多说了,只要知道这些css应该都能写出来,不会的平时多查查文…

Docker部署ChatGLM3、One API、FastGPT

创建并运行chatglm3容器 docker run --name chatglm3 -p 8000:8000 registry.cn-hangzhou.aliyuncs.com/ryyan/chatglm.cpp:chatglm3-q5_1 创建并运行one-api容器 (其中挂载路径 D:\one-api 可以选择你自己喜欢的目录) docker run --name oneapi -d -p 3000:3000 -e TZAsia…

k8s基本使用(namespace,pod增删查)-持续更新中

目录 1. 查看Namespace 2. 创建Namespace 2.1 使用纯命令行创建 2.2 编写yaml文件创建 3. 删除Namespace 3.1 使用纯命令行删除 3.2 使用yaml文件删除 二、Pod 1. 查看pod 1.1 查看默认空间的pod 1.2 查看指定空间的pod 1.3 查看全部pod 1.4 查看pod更多信息 1…

HUAWEI 华为交换机 配置 MAC 地址漂移检测示例

组网需求 如 图 2-17 所示,网络中两台 LSW 间网线误接形成了网络环路,引起 MAC 地址发生漂 移、MAC 地址表震荡。 为了能够及时检测网络中出现的环路,可以在 Switch 上配置 MAC 地址漂移检测功能, 通过检测是否发生MAC 地址漂移…

Python in Visual Studio Code 2024年3月发布

排版:Alan Wang 我们很高兴地宣布 2024 年 3 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: 新的“Add Imports”代码操作设置调试 Django 或 Flask 应用时自动启动浏览器Python REPL 的 Shell 集成对本…

Python学习:基本数据类型

Python3 命令行参数 Python 提供了 getopt 模块来获取命令行参数。 %> python test.py arg1 arg2 arg3Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表。 len(sys.argv) 计算命令行参数个数。 sys.argv[0] 表示脚本名。tes…

docker ENTRYPOINT [“sh“,“-c“,“java“,“-jar“,“Hello.jar“] 启动失败问题分析

因为没系统的学过linux语法,所以才会产生如下疑问。大佬请跳过。 问题:当在dockerfile里面配置 ENTRYPOINT ["sh","-c","java","-jar","Hello.jar"] ,启动对应容器时会无法正常运行&…

剑指offer经典题目整理(四)

一、树的子结构 1.链接 树的子结构_牛客题霸_牛客网 (nowcoder.com) 2.描述 给两颗二叉树A B,判断B是不是A的子结构 3.思路 将问题拆解开来,首先是找到a树中子结构的位置,然后是判断是否相同,也就是说,我们需要去…

【小白学机器学习8】统计里的自由度

目录 1 自由度 /degree of freedom / df 1.1 物理学的自由度(摘自网上 ^) 1.2 数学里的自由度 1.2.2 统计里的自由度 1.2.3 需要补充线性代数的,用线性代数来理解自由度 1.3 统计学里自由度的定义 1.4 自由度的公式 1.5 线性回归公式…

stm32使用时钟生成PWM时调用__HAL_TIM_SetAutoreload导致PWM消失处理

stm32使用时钟生成PWM时调用__HAL_TIM_SetAutoreload导致PWM消失处理 这一个是配置的时候没有使用影子寄存器导致的, 如果加载的Autoreload的值比原来的这一个值小, 这是会出现一个问题, 如果计数器里面的值记为Count, 如果改变的时候New_Autoreload < Count < Old_Auto…

结构体的增删查改

结构体&#xff0c;是为了解决生活中的一些不方便利用c语言自带数据类型来表示的问题。例如表示一个学生&#xff0c;那么学生这个个体假如用c语言自带数据类型怎么表示呢。可以使用名字&#xff0c;也就是字符数组&#xff1b;也可以使用学号&#xff0c;也就是int类型。但是这…

Hadoop学习2:完全分布集群搭建

文章目录 Fully-Distributed Operation&#xff08;完全分布模式&#xff09; 重点机器环境同步集群规划配置文件修改以及同步步骤0&#xff1a;下面其他步骤涉及修改配置以这里为准&#xff08;要不然部署使用过程会有很多问题&#xff09;通用配置&#xff08;三台节点机器&a…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

配置中心概述

目录 一、配置中心的定义 二、配置中心的工作 三、配置中心的作用 四、SpringBoot中的配置文件 一、配置中心的定义 配置中心就是用来管理项目当中所有配置的系统&#xff0c;也是微服务系统当中不可或缺的一部分。 nacos是一个更易于构建云原生应用的动态服务发现、配置管理…

服务器被大流量攻击怎么办?如何防御攻击?

随着网络的发展&#xff0c;我们所遇到的安全挑战也越来越多。尤其是近年来&#xff0c;网络攻击频发&#xff0c;许多互联网企业深受其扰。为了不影响自身业务的稳定运行&#xff0c;许多企业都在想方设法的寻求解决方案&#xff0c;防止服务器被攻击而影响业务发展。下面我们…

跨境电商选品实战——Ownips静态ip代理+Python爬虫轻松搞定Lazada电商选品

文章目录 一、引言二、Lazada电商平台爬虫实战2.1、分析Lazada电商平台的商品列表接口2.2、定位商品列表计算逻辑2.3、封装IP代理2.4、运行爬虫 三、数据处理及选品分析四、Ownips——企业级全球静态IP代理 一、引言 互联网与外贸的结合&#xff0c;催生了蓬勃兴起的跨境电子商…