设计模式 之 —— 组合模式

server/2024/9/22 21:04:29/

目录

什么是组合模式

定义

特点

结构

组合模式(java代码示例)

首先定义接口 

定义叶节点(Leaf类)

定义容器节点(Composite类)

测试类:

树形图

运行结果:

组合模式的优缺点

优点:

缺点:


什么是组合模式

定义

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

特点

树状层次结构:可以形成一个树的层次结构,很好地反映部分-整体的关系

单一接口:组合模式为所有的组件(叶子或容器)定义了一个统一的接口

动态组合:客户端可以在运行时动态地添加或删除组件(叶子或容器)

结构

  • Component接口:定义了所有对象必须实现的操作。
  • Leaf类:实现Component接口,代表树中的叶子节点。
  • Composite类:同样实现Component接口,并包含其他Component对象的集合。

组合模式(java代码示例)

首先定义接口 

interface Component {//定义了所有对象必须实现的操作void operation();
}

定义叶节点(Leaf类)

// 叶节点
class Leaf implements Component {private String name;public Leaf(String name) {this.name = name;}public void operation() {System.out.println("叶节点 " + name + " 执行操作");}
}

(实现Component接口)

定义容器节点(Composite类)

// 容器节点
class Composite implements Component {private String name;private List<Component> children = new ArrayList<>();public Composite(String name) {this.name = name;}public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}public void operation() {System.out.println("容器节点 "+ name +" 执行操作:");for (Component component : children) {component.operation();}}
}

(实现Component接口)

测试类:

//测试类
public class CompositePatternDemo {public static void main(String[] args) {// 创建叶节点Component leaf1 = new Leaf("Leaf 1");Component leaf2 = new Leaf("Leaf 2");// 创建容器节点Composite composite = new Composite("总容器");//把叶子节点添加到容器节点(也可把其它容器添加到容器节点)composite.add(leaf1);composite.add(leaf2);Component leaf3 = new Leaf("Leaf 3");Component leaf4 = new Leaf("Leaf 4");Composite composite2 = new Composite("小容器");composite2.add(leaf3);composite2.add(leaf4);composite.add(composite2);//composite.remove(composite2);//移除// 执行操作composite.operation();}
}
树形图

我写的上述代码的树形结构图如下:

运行结果:

组合模式的优缺点

优点:

客户端可以一致地处理单个对象和组合对象,不需要关心它们的具体类型(简化了客户端代码的编写和维护)

可以很容易地向树状结构中添加新的组件,而不需要修改现有的代码(提高了系统的灵活性和可扩展性)

部分-整体层次结构:更容易反映现实中事物的自然层次(有助于开发更加贴近现实的系统)

客户端不需要关心对象的组合结构,可以直接调用方法来操作树状结构中的元素(降低了客户端的复杂性)

缺点:

增加了设计的复杂度(组合模式需要引入许多新的类,如抽象构件、叶子和容器)

可能限制组件的类型:组合模式要求组件和叶子节点具有相同的接口,这可能会限制组件的类型(例如,所有的组件都必须实现相同的操作,即使某些组件并不需要这些操作)

对于复杂的树状结构,遍历操作的复杂度会较高。

组合模式的一个优点和缺点都是透明性:客户端不需要知道它是在处理单个对象(Leaf)还是组合对象(Composite)
但是,这种透明性也可能带来问题:客户端无法区分单个对象和组合对象,可能会导致误用或错误使用。


http://www.ppmy.cn/server/101192.html

相关文章

ssh免密登录下使用用scp命令复制本地主机文件到服务器仍然需要服务器密码怎么解决

在已经免密登录的情况下使用scp复制仍然需要服务器密码怎么解决&#xff1f; 由于在公司实习&#xff0c;在使用服务器的时候使用scp命令将本地文件复制到服务器上面发现需要服务器密码&#xff0c;不知道怎么解决。问了同组其他的人&#xff0c;她们都没有出现这种情况&#…

技术证书认证-附考试答案-AIGC与大模型通识-英特尔大湾区科技创新中心证书认证

目录 课程简介 面向人群 考核步骤 试题答案 知孤云出岫主页 课程以及考试链接&#xff1a;AIGC与大模型通识 - 英特尔大湾区科技创新中心 【英特尔大湾区科技创新中心】公益新课《AIGC与大模型通识》上线官网&#xff01;首期结业认证进行中&#xff0c;提升AI应用技能&…

ArcGIS10.8 安装教程

目录 一、环境及安装包准备 二、安装流程 1、解压安装包ArcGIS_108.rar 2、安装 三、汉化 四、激活 五、自定义菜单&#xff08;可选&#xff09; 六、打开软件按查看 七、安装过程中出现的报错 八、其他 一、环境及安装包准备 安装环境&#xff1a;win7 安装包下载…

mysql 小表驱动大表

A是小表&#xff0c;B是大表&#xff0c;应该这么写select * from A left join B on A.codeB.code 这样会省时间。左表被称为驱动表&#xff0c;右表被称为被驱动表。在优化的话&#xff0c;可以让被驱动表的字段加上索引&#xff0c;因为查找匹配项的时候可以走索引。 这样的…

【Python快速入门和实践019】Python常用脚本-查看视频信息并压缩视频

一、功能介绍 这段代码用于查看视频帧率&#xff0c;帧数以及大小&#xff0c;并且是否需要按照设定参数压缩原始视频。主要定义了两个主要函数&#xff1a;analyze_video 和 compress_video&#xff0c;以及一个主程序块来调用这些函数。下面是对这段代码功能的详细分析&#…

vue3动态引入图片不显示问题

方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事&#xff0c;不管是开发环境还是生产环境&#xff0c;可以始终以根目录保持图片路径的一致. 假设&#xff1a; 静态文件目录&#xff1a;src/assets/images/ 我们的目标静态文件在 …

LeetCode 热题100-4

移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums …

云计算的三大服务模式:IaaS、PaaS、SaaS的深入解析

在数字化转型的浪潮中&#xff0c;云计算以其独特的灵活性、可扩展性和成本效益&#xff0c;正逐渐成为企业IT架构的核心。云计算提供了三种主要的服务模式&#xff0c;分别是基础设施即服务&#xff08;IaaS&#xff09;、平台即服务&#xff08;PaaS&#xff09;和软件即服务…