23种设计模式之组合模式

news2024/11/27 12:57:16

组合模式

1、定义

组合模式:组合多个对象形成树状结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象

2、组合模式结构

  • Component(抽象构件):可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加、删除、获取子构件等
  • Leaf(叶子构件):表示叶子结点对象,没有子节点,它实现了抽象构件中定义的行为。对于访问及管理子构件的方法,可以通过抛出异常、提示错误等方法进行处理
  • Composite(容器构件):表示容器节点对象,包含子节点可以是叶子节点,也可以是容器节点,它提供了一个集合用于存储子节点。实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法

组合模式结构图

3、示例

Component

public abstract class Employer {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void add(Employer employer);

    public abstract void delete(Employer employer);

    public List<Employer> employers;

    public void printInfo() {
        System.out.println(name);
    }

    public List<Employer> getEmployers() {
        return this.employers;
    }
}

Leaf

public class Programmer extends Employer{

    public Programmer(String name) {
        setName(name);
        //程序员, 表示没有下属了
        employers = null;
    }

    @Override
    public void add(Employer employer) {}

    @Override
    public void delete(Employer employer) {}
}
public class ProjectAssistant extends Employer{

    public ProjectAssistant(String name) {
        setName(name);
        //项目助理, 表示没有下属了
        employers = null;
    }

    @Override
    public void add(Employer employer) {}

    @Override
    public void delete(Employer employer) {}
}

Composite

public class ProjectManager extends Employer{

    public ProjectManager(String name) {
        setName(name);
        employers = new ArrayList<>();
    }

    @Override
    public void add(Employer employer) {
        employers.add(employer);
    }

    @Override
    public void delete(Employer employer) {
        employers.remove(employer);
    }
}

Client

public class Client {

    public static void main(String[] args) {
        Employer pm = new ProjectManager("项目经理");
        Employer pa = new ProjectAssistant("项目助理");
        Employer programmer1 = new Programmer("程序员甲");
        Employer programmer2 = new Programmer("程序员乙");
        //为项目经理添加项目助理
        pm.add(pa);
        //为项目经理添加程序员
        pm.add(programmer1);
        pm.add(programmer2);

        List<Employer> ems = pm.getEmployers();
        for (Employer em : ems) {
            System.out.println(em.getName());
        }
    }
}

输出结果

项目助理
程序员甲
程序员乙

4、组合模式优缺点

4.1优点
  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,方便对整个层次结构进行控制
  • 客户端可以一致的使用一个组合结构或者其他单个对象,无须对现有类库进行任何修改,符合开闭原则
  • 增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则
  • 为树形结构的面向对象实现提供了一种灵活的解决方案
4.2缺点
  • 在增加新构件时很难对容器中的构件类型进行限制

5、组合模式适用环境

  • 表示对象的部分-整体层次结构
  • 忽略组合对象与单个对象的不同,统一

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

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

相关文章

【Unity】RPG2D龙城纷争(二)关卡、地块

更新日期&#xff1a;2024年6月12日。 项目源码&#xff1a;在第四章发布 索引 简介地块&#xff08;Block&#xff09;一、定义地块类二、地块类型三、地块渲染四、地块索引 关卡&#xff08;Level&#xff09;一、定义关卡类二、关卡基础属性三、地块集合四、关卡初始化五、关…

CorelDRAW 2024开启设计新纪元,终身永久版与中文破解版的全面解析及安装攻略

当我们谈论图形设计软件时&#xff0c;CorelDRAW无疑是一个响亮的名字。作为一款强大的矢量图形编辑工具&#xff0c;它以其丰富的功能和用户友好的界面赢得了全球设计师的喜爱。随着CorelDRAW 2024的发布&#xff0c;这个备受瞩目的版本带来了前所未有的创新特性&#xff0c;进…

Linux基础IO【II】

今天&#xff0c;我们接着在上一篇文章的基础上&#xff0c;继续学习基础IO。观看本文章之前&#xff0c;建议先看&#xff1a;Linux基础IO【I】&#xff0c;那&#xff0c;我们就开始吧&#xff01; 一.文件描述符 1.重新理解文件 文件操作的本质&#xff1a;进程和被打开文件…

【网络编程】套接字类型与协议设置

协议&#xff1a;计算机对话的通信规则&#xff0c;简而言之是为了完成数据交换而定好的约定。 #include<sys/socket.h> int socket(int domain, int type,int protocol); //domian使用的协议族信息&#xff0c;type传输类型&#xff0c;protocol计算机间通信使用的协议…

苹果WWDC重磅发布的IOS 18、Apple Intelligence背后的技术分析!

2024年6月10日&#xff0c;在2024年WWDC全球开发者大会上&#xff0c;苹果推出了Apple Intelligence&#xff0c;这是深度集成到iOS 18、iPadOS 18和macOS Sequoia中的个人智能系统。 为了让大模型能在 iPhone 端侧跑&#xff0c;苹果还是做了很多事情的。接下来就跟大家介绍一…

使用Java进行网络采集:代理IP与参数传递详解

在Java编程语言中&#xff0c;参数传递机制是一个常见的讨论话题。理解这一点对于编写高效且无错误的Java代码至关重要。本文将探讨Java的参数传递机制&#xff0c;解析其究竟是“按引用传递”还是“按值传递”&#xff0c;并结合网络爬虫技术的实例&#xff0c;展示如何在实际…

7 款便捷好用的AI API

AI API&#xff08;人工智能应用程序接口&#xff09;是一种软件中间件&#xff0c;它允许开发者和企业通过编程方式访问和集成人工智能服务到他们自己的应用程序、网站或系统中。AI API通常由专业的AI服务提供商开发和维护&#xff0c;使得用户无需深入了解复杂的AI算法和模型…

UML相关1

汽车租赁系统中的用例图简述(10分) 本系统根据功能可以分为三个用例图&#xff1a; 客户用例图&#xff1a;主要描述客户注册、登录、找回密码、查询车辆信息&#xff08;包括所有车辆信息、已借车辆信息、租赁历史信息&#xff09;、修改个人信息、网上预订车辆、电话预定车…

【强化学习】gymnasium自定义环境并封装学习笔记

【强化学习】gymnasium自定义环境并封装学习笔记 gym与gymnasium简介gymgymnasium gymnasium的基本使用方法使用gymnasium封装自定义环境官方示例及代码编写环境文件__init__()方法reset()方法step()方法render()方法close()方法 注册环境创建包 Package&#xff08;最后一步&a…

【QT5】<知识点> QT常用知识(更新中)

目录 一、更改文本颜色和格式 二、QT容器类 三、字符串与整数、浮点数之间的转换 四、QString常用功能 五、SpinBox的属性介绍 六、滑动、滚动、进度条和表盘LCD 七、时间、日期、定时器 一、更改文本颜色和格式 动态设置字体粗体&#xff1a;QFont对象的setBold方法动态…

Yapi代码执行 waf绕过实战记录

本文记录了2021年一次有趣的客户目标测试实战。这次经历颇为特别&#xff0c;因此我将其整理成笔记&#xff0c;并在此分享&#xff0c;希望对大家有所帮助。 事件起因 疫情在家办公&#xff0c;准备开始划水的一天&#xff0c;这时接到 boss 的电话说要做项目&#xff0c;老…

微调技术:人工智能领域的神奇钥匙

在人工智能的浪潮中&#xff0c;深度学习技术凭借其强大的数据处理和学习能力&#xff0c;已成为推动科技进步的重要引擎。然而&#xff0c;深度学习模型的训练往往需要大量的数据和计算资源&#xff0c;这在某些特定场景下成为了限制其发展的瓶颈。为了解决这个问题&#xff0…

SolidWorks 2016 SP5安装教程

软件介绍 Solidworks软件功能强大&#xff0c;组件繁多。 Solidworks有功能强大、易学易用和技术创新三大特点&#xff0c;这使得SolidWorks 成为领先的、主流的三维CAD解决方案。 SolidWorks 能够提供不同的设计方案、减少设计过程中的错误以及提高产品质量。SolidWorks 不仅…

JavaWeb6 Tomcat+postman请求、响应

Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发 部署web项目&#xff0c;对外提供网上信息浏览服务 Tomcat 轻量级web服务器&#xff0c;支持servlet&#xff0c;jsp等少量javaEE规范 也被称为web容器&#xff0c;servlet容器 Springboot有内置Tomcat nginx…

网络编程2----UDP简单客户端服务器的实现

首先我们要知道传输层提供的协议主要有两种&#xff0c;TCP协议和UDP协议&#xff0c;先来介绍一下它们的区别&#xff1a; 1、TCP是面向连接的&#xff0c;UDP是无连接的。 连接的本质是双方分别保存了对方的关键信息&#xff0c;而面向连接并不意味着数据一定能正常传输到对…

[CUDA 学习笔记] 稀疏矩阵向量乘法(SpMV) CUDA 实现与优化

稀疏矩阵向量乘法(SpMV) CUDA 实现与优化 本文主要围绕基于 CUDA 的 SpMV 实现进行介绍, 包括几种典型稀疏矩阵存储格式下 SpMV 的朴素实现, 以及 CSR 格式下的几种优化实现. 稀疏矩阵存储格式 稀疏矩阵即含有大量零元的矩阵. 对于稀疏矩阵, 像稠密矩阵一样使用二维数组来存…

物业管理的隐形杀手:纸质点检表,你还在用吗?

在日常的生活中&#xff0c;我们经常会看到小区物业保洁、客服人员在工作岗位忙忙碌碌&#xff0c;但忽略了默默为我们提供舒适环境的“隐形守护者”——物业设施设备。然而&#xff0c;一旦这些设备出现故障&#xff0c;我们的日常生活就会陷入混乱。那么&#xff0c;如何确保…

比特币不是解决货币伦理的「灵丹妙药」

原文标题&#xff1a;《Bitcoin is no ‘silver bullet’ for money’s ethical problems》 撰文&#xff1a;Stephen Katte 编译&#xff1a;Chris&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News 比特币和法定货币经常因货币伦理问题而受到批评&am…

AcWing 1639:拓扑顺序 ← 链式前向星

【题目来源】https://www.acwing.com/problem/content/1641/【题目描述】 这是 2018 年研究生入学考试中给出的一个问题&#xff1a; 以下哪个选项不是从给定的有向图中获得的拓扑序列&#xff1f; 现在&#xff0c;请你编写一个程序来测试每个选项。 【输入格式】 第一行包含两…

ffmpeg实现视频播放 ----------- Javacv

什么是Javacv和FFmpeg&#xff1f; Javacv是一个专门为Java开发人员提供的计算机视觉库&#xff0c;它基于FFmpeg和Opencv库&#xff0c;提供了许多用于处理图 像、视频和音频的功能。FFmpeg是一个开源的音视频处理工具集&#xff0c;它提供了用于编码、解码、转换和播放音视频…