十四、组合模式

news2024/11/28 13:47:55

一、什么是组合模式

  组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性。

  组合模式包含以下主要角色包含以下主要角色:

  • 树叶抽象构件(Component)角色:它的主要作用是为树叶构件声明公共接口,并实现它们的默认行为。
  • 树枝抽象构件(BranchComponent)角色:它的主要作用是为树枝构件声明公共接口,并实现它们的默认行为,扩展了树叶抽象角色。
  • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
  • 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

二、享元模式的实现

  组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点。

  • 树叶抽象构件(Component)
/**
* @author FluffyCatkin
* @version 1.0
* @date 2020/1/6 0006 15:56
* @description 抽象构件(Component)角色:它的主要作用是为树叶构件声明公共接口,并实现它们的默认行为。
*/
@FunctionalInterface
public interface Component {
   void operation();
}

  • 树叶构件(Leaf)
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/6 0006 16:01
 * @description 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
 */
public class Leaf implements Component {
    private String leafName;

    public Leaf(String leafName) {
        this.leafName = leafName;
    }

    @Override
    public void operation() {
        System.out.println("叶子节点:"+leafName+"被调用!");
    }

}

  • 树枝抽象构件(BranchComponent)
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/6 0006 15:56
 * @description  树枝抽象构件(BranchComponent)角色:它的主要作用是为树枝构件声明公共接口,并实现它们的默认行为,扩展了树叶抽象角色。
 */
public interface BranchComponent extends Component{

    /**
     * 新增叶子
     * @param component 叶子
     */
    void add(Component component);

    /**
     * 移除叶子
     * @param component 叶子
     */
    void remove(Component component);

    /**
     * 查找叶子
     * @param index 叶子下标
     * @return 叶子
     */
    Component getChild(int index);
}

  • 树枝构件(Composite)

/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/6 0006 16:01
 * @description 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法
 */
public class Composite implements BranchComponent {
    private List<Component> children = new ArrayList<>();
    private String compositeName ;

    public Composite(String compositeName) {
        this.compositeName = compositeName;
    }

    @Override
    public void operation() {
        System.out.println("树枝:"+compositeName+"被调用!");
        children.parallelStream().forEach(Component::operation);
    }

    /**
     * 新增叶子
     * @param component 叶子
     */
    @Override
    public void add(Component component){
        children.add(component);
    }

    /**
     * 移除叶子
     * @param component 叶子
     */
    @Override
    public void remove(Component component){
        children.remove(component);
    }

    /**
     * 查找叶子
     * @param index 叶子下标
     * @return 叶子
     */
    @Override
    public Component getChild(int index){
        return children.get(index);
    }
}

  • 测试类

/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/6 0006 15:53
 * @description 组合模式
 *
 * 在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。
 * 组合模式的定义与特点:
 * 组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
 * 组合模式的主要优点有:组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
 * 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
 *
 * 其主要缺点是:设计较复杂,客户端需要花更多时间理清类之间的层次关系;
 * 不容易限制容器中的构件;
 * 不容易用继承的方法来增加构件的新功能;
 * 模式的结构:
 * 组合模式包含以下主要角色。
 * 树叶抽象构件(Component)角色:它的主要作用是为树叶构件声明公共接口,并实现它们的默认行为。
 * 树枝抽象构件(Component)角色:它的主要作用是为树枝构件声明公共接口,并实现它们的默认行为,扩展了树叶抽象角色。
 * 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
 * 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
 *
 * 组合模式的应用场景:
 * 前面分析了组合模式的结构与特点,下面分析它适用的以下应用场景。在需要表示一个对象整体与部分的层次结构的场合。
 * 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。
 *
 */
public class Main {
    /**
     * 测试组合模式
     */
    @Test
    public void compositeTest(){
        //组装树形结构
        Composite composite1 = new Composite("树枝1");
        Composite composite2 = new Composite("树枝2");

        Leaf leaf1 = new Leaf("叶子1");
        Leaf leaf2 = new Leaf("叶子2");
        Leaf leaf3 = new Leaf("叶子3");

        composite1.add(leaf1);
        composite1.add(composite2);
        composite2.add(leaf2);
        composite2.add(leaf3);
        //遍历
        composite1.operation();
    }
}

执行结果:

树枝:树枝1被调用!
树枝:树枝2被调用!
叶子节点:叶子3被调用!
叶子节点:叶子2被调用!
叶子节点:叶子1被调用!

Process finished with exit code 0

三、应用场景

  它适用的以下应用场景:

  • 在需要表示一个对象整体与部分的层次结构的场合。
  • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

四、优缺点分析

  组合模式的主要优点有

  • 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
  • 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

  其主要缺点是

  • 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
  • 不容易限制容器中的构件;
  • 不容易用继承的方法来增加构件的新功能;

代码地址:https://gitee.com/fluffycatkin/JavaDesignModel.git

    image.png

原文出处:http://c.biancheng.net/view/1373.html

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

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

相关文章

极限五分钟,在宝塔中用 Docker 部署升讯威在线客服系统

最近客服系统成功经受住了客户现场组织的压力测试&#xff0c;获得了客户的认可。 客户组织多名客服上线后&#xff0c;所有员工同一时间打开访客页面疯狂不停的给在线客服发消息&#xff0c;系统稳定无异常无掉线&#xff0c;客服回复消息正常。消息实时到达无任何延迟。 本文…

IDEA maven上传速度很慢、解决办法

maven上传的速度很慢&#xff0c;排除网络原因&#xff0c;需要检查配置 一、项目配置 以下针对于maven仓库不在C盘的情况&#xff1a; File | Settings | Build, Execution, Deployment | Build Tools | Maven 以IDEA为例&#xff0c;打开 File&#xff08;文件&#xff09;…

【Vue3+Ts】项目启动准备和配置项目代码规范和css样式的重置

项目启动准备 创建项目&#xff08; 使用Vite 构建工具创建项目模板&#xff09;目录介绍插件安装创建别名编译说明项目配置配置icon和标题配置项目别名配置ts.config.json检测vscode的插件是否配置 配置项目代码规范集成editorconfig配置prettier工具库ESLint检测配置 CSS样式…

软件测试/测试开发丨Selenium 高级定位 Xpath

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27036 一、xpath 基本概念 XPATH是一门在XML文档中查找信息的语言 XPATH使用路径表达式在XML文档中进行导航 XPATH的应用非常广泛&#xff0c;可以用于UI自…

使用Visual Studio 2022实现透明按钮和标签、POPUP样式窗体的一种工业系统的UI例程

例程实现的功能说明 1、主窗体采用POPUP样式&#xff0c;无标题栏、无菜单栏&#xff0c;适合工业类软件 2、按钮、标签使用自绘&#xff0c;实现透明样式&#xff0c;可以实现灵活的样式设计&#xff0c;更具设计感 按钮重绘函数&#xff1a;OnDrawItem()按钮样式设定&#…

微软 Turing Bletchley v3视觉语言模型更新:必应搜索图片更精准

据微软新闻稿透露&#xff0c;在推出第三代Turing Bletchley视觉语言模型后&#xff0c;微软计划逐步将其整合到Bing等相关产品中&#xff0c;以提供更出色的图像搜索体验。这款模型最初于2021年11月面世&#xff0c;并在2022年秋季开始邀请用户测试。 凭借用户的反馈和建议&am…

Spring Boot 中 Nacos 配置中心使用实战

官方参考文档 https://nacos.io/zh-cn/docs/quick-start-spring-boot.html 本人实践 1、新建一个spring boot项目 我的spirngboot版本为2.5.6 2、添加一下依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

FL studio21.1中文最新版FL萝卜音乐制作软件

FL studio21.1版中文名字叫做水果音乐编曲软件&#xff0c;是一款非常专业的电脑音乐制作软件。全新的21版本在功能上进行了升级&#xff0c;帮助用户来进行编曲、剪辑、录音、混音等多种工作&#xff0c;还可以为用户提供很多音乐创作的灵感&#xff0c;让你制作出各种好听的音…

postgresql-通用表表达式

postgresql-通用表表达式 简介简单 CTE递归 CTE案例1案例2 DML 语句与 CTE 简介 通用表表达式&#xff08;Common Table Expression、CTE&#xff09;是一个临时的查询结果或者临时表&#xff0c;可以 在其他 SELECT、INSERT、UPDATE 以及 DELETE 语句中使用。通用表表达式只在…

关闭jenkins插件提醒信息

jenkins提醒信息和安全警告可以帮助我们了解插件或者jenkins的更新情况&#xff0c;但是有些插件是已经不维护了&#xff0c;提醒却一直存在&#xff0c;看着糟心&#xff0c;就像下面的提示 1、关闭插件提醒 找到如下位置&#xff1a;系统管理-系统配置-管理监控配置 打开管…

SQL注入 - POST注入方法

文章目录 注入流程正常尝试弱口令登录判断是否存在注入&#xff0c;是否会将用户输入拼接到sql语句&#xff0c;并当做代码执行尝试是否需要闭合语句尝试注释掉后面得语句判断字段数判断显错位判断当前数据库名判断当前数据库下的表名判断当前数据库下users表的列名获取usernam…

DHCP中继实验

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. 配置IP地址2.配置R1为DHCP服务器&#xff0c;能够跨网段为192.168.2.0/24网段自动分配IP地址3. 在PC3上Ping 192.168.1.1&#xff0c;确认可以Ping通 摘要&#xff1a; 本实验旨在通过配置DHCP中继实现跨网…

stm32---用外部中断实现红外接收器

一、红外遥控的原理 红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传 输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是 家用电器广泛采用&#xff0c;并越来越多的应用到计算机系…

电缆工厂 3D 可视化管控系统 | 智慧工厂

近年来&#xff0c;我国各类器材制造业已经开始向数字化生产转型&#xff0c;使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术&#xff0c;企业可以更好地监控生产线上的运行和质量情况&#xff0c;及时发现和解决问题&#xff0c;从而提高生产效率…

2023-8-30 八数码(BFS)

题目链接&#xff1a;八数码 #include <iostream> #include <algorithm> #include <unordered_map> #include <queue>using namespace std;int bfs(string start) {string end "12345678x";queue<string> q;unordered_map<strin…

[ZenTao]源码阅读:自定义任务类型

1、module/custom/control.php 2、module/custom/model.php

线性代数的学习和整理13: 定义域,值域,到达域 和单射,满射,双射,反函数,逆矩阵

目录 1 函数与 向量/矩阵 2 初等数学的函数 2.1 函数 2.2 函数的定义&#xff1a;定义域 →映射→ 值域 3 高等数学里的函数&#xff1a;定义域和陪域/到达域&#xff08;非值域&#xff09;的映射关系 3.1 函数 3.2 单射&#xff0c;满射&#xff0c;双射等都是针对…

整流二极管 DL4001~DL4007:1000V 1A

国产二极管品牌厂家东沃电子&#xff08;DOWOSEMI&#xff09;推出的整流二极管种类繁多、封装多样、型号齐全&#xff0c;根据正向电流大小来分&#xff0c;有&#xff1a;1A、1.5A、2A、3A、5A、6A、10A等等。关于整流二极管&#xff0c;之前东沃电子科普过很多这方面的知识和…

前端自学总结

文章目录 一、nodejs1.1、npm配置命令别名 二、JavaScript2.1、javascript注释 一、nodejs 1.1、npm配置命令别名 我们可以使用“node index.js”的方式运行代码 也可以利用npm配置别名的方式运行代码 在package.json中配置别名&#xff0c;利用“npm run 别名”也可以运行 st…

5000字详解OpenAI超级对齐四年计划:定义、挑战与方法

导读 超级智能是一把双刃剑&#xff0c;有助于解决许多重要问题&#xff0c;同时也可能削弱人类的权力并威胁我们的安全。为了治理这些风险&#xff0c;急需建立新的治理机构并解决AI模型的对齐问题。OpenAI于今年7月首次提出超级对齐的概念&#xff0c;并宣布投入20%的计算资源…