十四、组合模式

一、什么是组合模式

  组合(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;}@Overridepublic 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;}@Overridepublic void operation() {System.out.println("树枝:"+compositeName+"被调用!");children.parallelStream().forEach(Component::operation);}/*** 新增叶子* @param component 叶子*/@Overridepublic void add(Component component){children.add(component);}/*** 移除叶子* @param component 叶子*/@Overridepublic void remove(Component component){children.remove(component);}/*** 查找叶子* @param index 叶子下标* @return 叶子*/@Overridepublic 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 {/*** 测试组合模式*/@Testpublic 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.mzph.cn/news/60763.shtml

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

相关文章

从零开始搭建并运行mmsegmentation

安装&#xff1a; Step 1:创建Conda 环境并激活之 conda create --name openmmlab python3.8 -y conda activate openmmlab Step 2&#xff1a;CUDA版本选择&#xff0c;及安装Pytorch 关于设备GPU的cuda版本&#xff0c;根据如下的选择原则&#xff1a; 对于Ampere架构的…

无感刷新:Vue前端实现Token的无缝刷新机制

在现代Web应用程序中&#xff0c;用户身份验证和授权通常使用令牌&#xff08;Token&#xff09;机制来实现。然而&#xff0c;由于Token的过期时间限制&#xff0c;用户在长时间使用应用程序时可能需要重新登录。为了提供更好的用户体验&#xff0c;我们可以通过实现Token的无…

Python 和 C++ 使用细节差别

1. 循环中的可迭代对象长度 1. 循环中的可迭代对象长度 C 中&#xff0c;for循环中写明a.size()&#xff0c;每次循环这个值是重新计算的&#xff1b; # include “iostream” # include <vector> using namespace std;int main() {vector<int> a(10);int cnt 0…

7.Redis-list

list list常用命令lpushlrangelpushxrpushrpushxlpop / rpoplindexlinsertllenlremltrimlset 阻塞版本命令blpop/brpop 总结内部编码应用场景使用redis作为消息队列 redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组&#xff0c;而是更…

拓世科技集团 | “书剑人生”李步云学术思想研讨会暨李步云先生九十华诞志庆

2023年&#xff0c;中国改革开放迎来了45周年&#xff0c;改革春风浩荡&#xff0c;席卷神州大地&#xff0c;45年间&#xff0c;中国特色社会主义伟大事业大步迈入崭新境界&#xff0c;一路上结出了饶为丰硕的果实。中华民族在这45年间的砥砺前行&#xff0c;不仅使中国的经济…

学会电子商务个性化这一招,让你的客户源源不断

在增加销售额和创建客户喜爱的品牌时&#xff0c;电子商务个性化是您成功的关键。但是&#xff0c;个性化您的在线购物体验的各个方面似乎都不是那么简单。 幸运的是&#xff0c;您看到了这一篇文章。在本文中&#xff0c;我们将探讨为什么电子商务个性化如此重要。在此过程中…

NTP服务器时间配置

简介 ntp服务器是一个同步时间都服务器。 开启ntpd 1.查看状态&#xff08;可以看到状态为&#xff1a;inactive&#xff0c;也就是没有启动ntp服务&#xff09; [rootlocalhost]$ systemctl status ntpd ● ntpd.service - Network Time ServiceLoaded: loaded (/usr/lib/…

C# Timer定时器

C# Timer定时器 Timer定时器定时器主要用到的就是Timer的Tick事件&#xff0c;另外还要设置时间间隔&#xff1a; 下面这个实力演示了每隔一秒&#xff0c;picturebox中的图片来回切换&#xff0c;每隔一秒&#xff0c;文本框中显示当前时间。 using System; using System.Co…

5. 线性层及其他层

5.1 神经网络结构 5.2 线性拉平 import torch import torchvision from torch import nn from torch.nn import ReLU from torch.nn import Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datase…

【核心复现】基于合作博弈的综合能源系统电-热-气协同优化运行策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

信看课堂笔记—LDO和DC-DC电路打PK

LDO&#xff08;low dropout voltage regulator&#xff0c;低压差线性稳压器&#xff09;和DC-DC(Direct current-Direct current converter&#xff0c;直流电压转直流电压转换器)电源是非常常见的电源电路&#xff0c;LDO 出来的比较早&#xff0c;像老戏骨一样&#xff0c;…

kotlin实现java的单例模式

代码 package com.flannery.interviewdemo.singleinstance//https://blog.csdn.net/Jason_Lee155/article/details/128796742 Java实现 //public class SingletonDemo { // private static SingletonDemo instancenew SingletonDemo(); // private SingletonDemo() // …

1.00001git源码clone后进行编译(带调试)

– 新建用户 useradd postgres passwd postgres – 用户加入sude组 先cd到/etc/sudoers目录下 由于sudoers文件为只读权限&#xff0c;所以需要添加写入权限&#xff0c;chmod uw sudoers vim sudoers 找到root ALL (ALL) ALL这一行&#xff0c;在下一行加入username ALL (A…

LeetCode每日一题:1654. 到家的最少跳跃次数(2023.8.30 C++)

目录 1654. 到家的最少跳跃次数 题目描述&#xff1a; 实现代码与解析&#xff1a; bfs 1654. 到家的最少跳跃次数 题目描述&#xff1a; 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 …

Kubernetes技术--k8s核心技术yaml资源编排

(1).引入 我们可以使用kubectl实现单行指令的操作,但是这样做的坏处是不复用,所以为了更好的实现对一系列资源的编排工作。kuberntes中使用一种叫做资源清单文件(yaml)来实现对资源管理和资源对象编排部署。 (2).概述 yaml是一种标记语言。为了强调这种语言以数据做为中心,而…

2023年高教社杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

QQ邮件营销

邮件营销效果好的莫过于QQ邮件营销&#xff0c;QQ邮件收件会自动弹窗提示&#xff0c;邮件的阅读率是所有目前邮箱中最高的&#xff0c;而QQ邮件规则使用的叶贝思反垃圾邮件算法会有效防止一般的群发邮件&#xff0c;一米智能QQ邮件营销系统针对性的解决了这个难题。另外我们对…

分布式集群——jdk配置与zookeeper环境搭建

系列文章目录 分布式集群——jdk配置与zookeeper环境搭建 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍 文章目录 系列文章目录 前言 一 zookeeper介绍与环境配置 1.1 zookeeper的学习 1.2 Zookeeper的主要功能 1.2.1 znode的节点类型 1.2.2 zookeeper的实现 …

【实战】十一、看板页面及任务组页面开发(六) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

电商平台api接口拼多多根据关键词获取商品列表示例

拼多多根据关键词获取商品接口的意义&#xff1b; 实现商品搜索&#xff1a;通过关键词搜索商品API接口&#xff0c;电商平台可以为消费者提供一个简单、快捷的商品搜索功能。用户只需输入关键词&#xff0c;就可以得到与该关键词相关的商品列表。 提供便捷的商品搜索服务&…