技术成神之路:设计模式(十七)组合模式

news2024/11/16 19:30:10

介绍

组合模式(Composite Pattern)是一种结构型设计模式,它使你能够将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

1.定义


组合模式允许将叶子对象和组合对象(容器对象)统一处理。

2. 主要作用


  • 简化客户端代码:客户端可以使用相同的方式处理单个对象和组合对象,减少了代码复杂度。
  • 构建树形结构:能够轻松地创建和管理复杂的树形结构。
  • 便于扩展:新增的叶子对象或组合对象不需要修改现有代码。

3. 解决的问题


  • 在需要处理树形结构时,直接使用传统的对象管理会导致复杂性和不一致性。
  • 组合模式提供了一种方式,使得叶子节点和组合节点都实现相同的接口,从而提供了一种一致的调用方式。

4. 模式原理


包含角色:

  • Component(组件):定义了组合对象和叶子对象的共同接口,可以包含一些默认的行为。
  • Leaf(叶子节点):叶子节点,只实现了Component接口的行为,不包含其他子节点。
  • Composite(组合节点):组合节点,实现了Component接口,并且包含子节点的管理功能,比如添加、删除和遍历子节点。

UML类图:
在这里插入图片描述
简单示例:

// Component
interface FileSystemComponent {
    void showDetails();
}

// Leaf
class File implements FileSystemComponent {
    private String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    public void showDetails() {
        System.out.println("File: " + name);
    }
}

// Composite
class Folder implements FileSystemComponent {
    private String name;
    private List<FileSystemComponent> components = new ArrayList<>();

    public Folder(String name) {
        this.name = name;
    }

    public void addComponent(FileSystemComponent component) {
        components.add(component);
    }

    public void removeComponent(FileSystemComponent component) {
        components.remove(component);
    }

    @Override
    public void showDetails() {
        System.out.println("Folder: " + name);
        for (FileSystemComponent component : components) {
            component.showDetails();
        }
    }
}

调用

public class CompositePatternDemo {
    public static void main(String[] args) {
        FileSystemComponent file1 = new File("File1.txt");
        FileSystemComponent file2 = new File("File2.txt");

        Folder folder = new Folder("MyFolder");
        folder.addComponent(file1);
        folder.addComponent(file2);

        folder.showDetails();
    }
}

打印输出

Folder: MyFolder
File: File1.txt
File: File2.txt

到这里,不知道你是不是有和我同样的疑问,在Java中 File 是不是实现了组合模式?

File类中,文件和目录(文件夹)之间的关系可以被看作是组合模式的体现。一个File对象可以表示一个文件,也可以表示一个目录。目录可以包含多个File对象(文件和子目录),形成树状结构,而且他们都有统一的方法 listFiles()delete()renameTo()等。这意味着,无论你在操作文件还是目录,都可以通过相同的方法来进行操作,这体现了组合模式的核心思想。BUTFile 类本身并没有直接实现组合模式,可以被视为一种组合模式的应用,并非严格意义上的组合模式。
类似的还有 Java 的集合框架中,java.util.Listjava.util.Set 等接口的实现类如 ArrayListHashSet等。

那么,在SDK中有没有典型的组合模式实例?答案是肯定的。

在 Android 中,View 是所有 UI 组件的基类,而 ViewGroup 是一个特殊的 View,它可以包含其他 View

Component(组件)View 是基本组件,代表 UI 中的一个元素。
Leaf(叶子节点)View 又代表叶子节点,因为它们不包含子视图。
Composite(组合节点)ViewGroup 代表组合节点,可以包含多个 View 或其他 ViewGroup

这样就可以统一创建和管理复杂的用户界面了。

5. 优缺点


优点:

  1. 客户端可以以一致的方式处理单个对象和组合对象。
  2. 增加新组件时,系统的扩展性良好。

缺点:

  1. 设计复杂性增加,因为需要定义一个接口或抽象类。
  2. 不适合过于复杂的树形结构。

6. 应用场景


  • 想表示对象的部分-整体层次结构。
  • 希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。

7. 总结


组合模式是一种强大的设计模式,适用于处理树形结构中的对象关系。通过将对象组合成树形结构,组合模式使得客户端可以统一地处理单个对象和组合对象,从而简化了代码逻辑和结构。然而,组合模式也增加了类的复杂性,需要在设计时权衡其优缺点。

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

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

相关文章

猫头虎带您解决:‘vue-cli-service’ 不是内部或外部命令

猫头虎带您解决&#xff1a;‘vue-cli-service’ 不是内部或外部命令 &#x1f680; 今天猫头虎收到一个粉丝的提问&#xff1a;“猫哥&#xff0c;我在用 Vue 项目的时候&#xff0c;运行命令 npm run serve 出现了错误提示&#xff0c;vue-cli-service 不是内部或外部命令&a…

玄机--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容&#xff0c;提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器&#xff0c;提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件&#xff0c;提交文件绝对路径 蚁剑流量特征总结 …

参会通知!第三届计算、通信、感知与量子技术国际会议(CCPQT 2024)

参会通知&#xff01;新增特别论坛&#xff1a;国自然基金经验分享 第三届计算、通信、感知与量子技术国际会议&#xff08;CCPQT 2024&#xff09;将于2024年10月25-27日在珠海召开&#xff0c;聚焦感知技术、绿色通信等&#xff0c;由北邮主办&#xff0c;宁波大学协办。会议…

seL4 IPC(五)

官网链接&#xff1a;link 求解 代码中的很多方法例如这一个教程里面的seL4_GetMR(0)&#xff0c;我在官方给的手册和API中都搜不到&#xff0c;想问一下大家这些大家都是在哪里搜的&#xff01;&#xff01; IPC seL4中的IPC和一般OS中讲的IPC概念相差比较大&#xff0c;根…

华大基因用药指导基因检测助力优化治疗方案,科学管理糖尿病

糖尿病是全球范围内的一个重大公共卫生问题。据国际糖尿病联盟&#xff08;IDF&#xff09;统计&#xff0c;全球糖尿病患者人数约为5.39亿&#xff0c;其中中国患者数量约为1.409亿。作为一种慢性代谢性疾病&#xff0c;糖尿病往往不是独立存在的&#xff0c;通常还会伴随着多…

【SSM_Day3】JSON字符串和Java对象互转

【SSM_Day3】JSON字符串和Java对象互转 JSON档案JSON字符串和Java对象互转BEJSON&#xff1a;在线JSON格式化校验工具 JSON档案 数据格式是描述数据保存在文件或记录中的规则&#xff0c;比如Excel就是一种数据格式&#xff0c;数据保存在Excel的表格中。JSON也是一种数据格式…

【JAVA报错已解决】Java.lang.NumberFormatException

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Python:百度贴吧实现自动化签到

早知道&#xff0c;还是python。 Github项目仓库在这。 相关API 签到贴吧列表 签到分为两个接口&#xff0c;PC端签到一次经验2&#xff0c;而移动端签到则是一次经验6。该用哪个接口已经很明显了。不过这里还是列出PC端的签到API。 # PC端签到接口 # sign_url "https:…

Hive SQL业务场景:连续5天涨幅超过5%股票

一、需求描述 现有一张股票价格表 dwd_stock_trade_dtl 有3个字段分别是&#xff1a; 股票代码(stock_code), 日期(trade_date)&#xff0c; 收盘价格(closing_price) 。 请找出满足连续5天以上&#xff08;含&#xff09;每天上涨超过5%的股票&#xff0c;并给出连续满足…

LLM大模型书籍:专补大模型短板的RAG入门与实战书来了!

文末赠书 RAG自2020年由Facebook AI Research推出后&#xff0c;一下子就窜红了。 毕竟&#xff0c;它是真的帮了大忙&#xff0c;在解决大语言模型的“幻觉”问题上起到了关键作用。 如今&#xff0c;Google、AWS、IBM、微软、NVIDIA等科技巨头都在支持RAG应用的开发。微软…

AGI interior designer丨OPENAIGC开发者大赛高校组AI创作力奖

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

同步、异步、阻塞、非阻塞的关系

相关介绍 1、同步与异步&#xff1a;针对调用方而言。调用方是否需要等待返回调用结果。异步不需要等待&#xff0c;可以采用状态通知、回调函数的方式获取结果&#xff0c;以read文件为例 同步方式读取文件&#xff1a;read(filename)&#xff0c;直接读取文件&#xff0c;需…

【C语言训练题库】第一次出现的字符

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 1. 题目 给出一串字符串&#xff0c;找出第一次只出现一次的字符&#xff0c;并返回它的位置&#xff0c;如果不存在&#xff0c;则返回-1 例&#xff1a; 输入&…

电缆缺陷检测系统源码分享

电缆缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Llama3的本地部署

Llama3是Meta于2024年4月18日开源的LLM&#xff0c;目前开放了8B和70B两个版本&#xff0c;两个版本均支持最大为8192个token的序列长度( GPT-4支持128K ) Llama3在Meta自制的两个24K GPU集群上进行预训练&#xff0c;使用15T的训练数据&#xff0c;其中5%为非英文数据&…

SAP 用户密码策略设置简介(不需要重启服务器)

SAP 用户密码策略设置简介(不需要重启服务器 1. 密码长度和复杂性2. 密码有效期3. 密码历史记录4. 账户锁定5. 单点登录&#xff08;SSO&#xff09;6. 安全提示和教育7. 配置密码策略的步骤8. 监控和审计 业务场景系统设置 好的&#xff0c;这里是关于SAP用户密码策略的更详细…

7.字符串 Strings

作业系统链接 字符串文字可以使用单引号、双引号或三引号来定义&#xff0c;其中三引号特别适用于多行字符串。转义序列如\n&#xff08;换行&#xff09;和\t&#xff08;制表符&#xff09;在字符串中起到特殊作用。字符串方法如replace()、strip()、lower()和upper()提供了丰…

「漏洞复现」誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

基于RepLKNet31B模型在RML201610a数据集上的调制识别【代码+数据集+python环境+GUI系统】

基于RepLKNet31B模型在RML201610a数据集上的调制识别【代码数据集python环境GUI系统】 Loss曲线 背景意义 随着社会的快速发展&#xff0c;人们在通信方面的需求逐渐增加&#xff0c;特别是在无线通信领域。通信环境的复杂化催生了多种通信形式和相关应用&#xff0c;这使得调…

【Java】类型转换 —— 自动转换、强制转换与表达式类型自动提升

1&#xff0e;自动类型转换 Java中的自动类型转换就好比将小瓶水倒入到大瓶的换装过程。我们将小瓶水倒入到大瓶中时&#xff0c;由于小瓶的容量比大瓶的容量小&#xff0c;所以倒入的水永远不可能溢出大瓶。同样&#xff0c;在Java中&#xff0c;将取值范围小的数据类型的变量…