23种设计模式之组合模式

组合模式

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、组合模式适用环境

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab…

Spring—bean

一、bean的作用域 单例 默认化为&#xff1a;单例&#xff08;singleton&#xff09; SpringBean类&#xff1a; package com.hei.bean; public class SpringBean { public SpringBean(){System.out.println("Springbean的无参数构造方法执行了"); } } spring,xml…

网络安全领域国内外有哪些法律法规?

1. 中国 1.中华人民共和国网络安全法&#xff08;简称网安法&#xff09; 生效时间&#xff1a;2017年6月1日主要内容&#xff1a;规范网络运营行为&#xff0c;维护网络安全&#xff0c;保护国家安全和公共利益&#xff0c;以及保护公民、法人和其他组织的合法权益。 2.中华…

CMA、CNAS软件检测报告如何收费?软件测评中心出具报告需多久?

众所周知&#xff0c;各行各业都需要资质认证&#xff0c;正如教师会有教师资格证&#xff0c;医师会有医师资格证&#xff0c;律师会有律师证&#xff0c;软件产品亦如此。对于软件测试报告来说CMA和CNAS资质认证就是获得行业甚至国家认可的重要依据。 CMA和CNAS软件检测报告…

将对象序列化到文件

ObjectOutputStream可以将一个内存中的Java对象通过序列化的方式写入到磁盘的文件中。被序列化的对象必须要实现Serialzable序列化接口&#xff0c;否则会抛出异常。 创建对象 public class Users implements Serializable {private int userid;private String username;priv…

C++和C语言到底有什么区别?

引言&#xff1a;C和C语言是两种非常常见的编程语言&#xff0c;由于其广泛的应用和灵活性&#xff0c;它们在计算机科学领域内受到了广泛的关注。虽然C是从C语言发展而来的&#xff0c;但是这两种语言在许多方面都有所不同。本文将对C和C语言进行比较和分析&#xff0c;以便更…

C++中的结构体——结构体中const的使用场景

作用&#xff1a;用const来防止误操作 示例 运行结果

2024最新流媒体在线音乐系统网站源码 音乐社区 多语言开心版

本文选自&#xff1a;2024最新流媒体在线音乐系统网站源码 音乐社区 多语言开心版 - 源码1688 应用介绍 简介&#xff1a; 2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版 图片&#xff1a;

独立游戏之路:Tap篇 -- 获取OAID提升广告收益

Unity 之 获取手机:OAID、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA)二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建四、总结前言 在当今的移动…

staruml怎么合并多个Project工程文件

如图现在有两个staruml文件 现在我想要把project2合并到project1里面 步骤如下&#xff1a; 1、首先打开project2 2、如图选择导出Fragment 3、选中自己想导出的模块&#xff08;可以不止一个&#xff09; 4、将其保存在桌面 5、打开project1 6、选择导入 7、选中刚刚…

RocketMQ事务性消息

RocketMQ事务性消息是一定能保证消息发送成功的 事务消息发送步骤&#xff1a; &#xff08;1&#xff09;发送方将半事务消息发送至RocketMQ服务端。 &#xff08;2&#xff09;RocketMQ服务端将消息持久化之后&#xff0c;向发送方返回ack确认消息已经发送成功。由于消息为…

H323 截包分析辅流问题

辅流问题&#xff08;h264\h264hp\h265&#xff09; 终端1 &#xff1a; 192.168.1.1 入会发送辅流 终端2 &#xff1a; 192.168.1.2 入会接收辅流 问题 &#xff1a; 终端2不显示辅流 1、筛选 h245 h225 协议 分别筛选以下IP进行查看截包内容 (h225 || h245) && …

10 款最佳免费 Google SEO 工具

谷歌提供了免费测试和报告的工具&#xff0c;以帮助网站所有者和 SEO 专业人员分析和提高其网站的搜索性能。这些是最好的免费谷歌搜索引擎优化工具&#xff0c;用于升级您的搜索引擎优化&#xff0c;以及帮助您发现新的关键字机会以及帮助您发现新的关键字机会的工具。 无论您…

C++并发之定时互斥(std::timed_mutex)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 lock3.3 try_lock3.4 try_lock_for3.5 try_lock_until3.6 unlock1 概述 定时互斥是一种时间可锁定的对象,它设计用于在代码的关键部分需要独占访问时发出信号,就像常规互斥一样,但还支持定时尝试锁定请求。   因此,time…

【算法专题--链表】合并两个有序链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐迭代法 --- 带哨兵位&#xff08;头节点&#xff09; ⭐递归法 四、总结与提炼 五、共勉 一、前言 合并两个有序链表这道题&#xff0c;可以说是--链表专题--&#xff0c;比较经典的一道题&#xff0c;也是在面试中频率较高的一道…

javaSSM整合的一个小项目(员工管理系统)

前言&#xff1a; 本人是一个大三的计算机专业学生。这学期学习了Java的企业级应用开发这门课&#xff0c;最后&#xff0c;有一个结课的小项目&#xff0c;是使用SSM整合写一个系统。我本次写的是一个员工管理系统&#xff0c;虽然十分的简单&#xff0c;但是足以应对这次的期…

[学习笔记] VFX Silhouette

目录 Part 1 : The interface of Silhouettte &#xff08;Silhouette的界面介绍&#xff09; Part 2: The shape divisions and manual roto&#xff08;形状分区和手动roto工作&#xff09;: Part 3: tracking &#xff1a; Part 4: Mocha Tracking Part 5: Motion Blur(…

ColorEasyDuino上手指南

介绍 ColorEasyDuino是嘉立创推出的一块Aduino开发板&#xff08;类似物&#xff09;&#xff0c;具有丰富的外设接口&#xff1a;uart、i2c、spi、adc、pwm等&#xff1b;开发板设计参考原型是Arduino Uno&#xff0c;采用的芯片是ATMEGA328P&#xff0c;它的外观设计比较紧凑…

【git使用三】git工作机制与命令用法

目录 git工作机制和相关概念 四个重要区域 分支的概念 上传代码到远程分支的基本流程 克隆代码 仓库同步 开发者如何提交代码到远程仓库分支 1.初始化本地仓库 2.关联本地仓库和远程仓库 创建关联 查看关联情况 如何解除关联 3.推送代码到远程仓库 3.1先下拉远程…

Python算法于强化学习库之rlax使用详解

概要 在强化学习领域,开发和测试各种算法需要使用高效的工具和库。rlax 是 Google 开发的一个专注于强化学习的库,旨在提供一组用于构建和测试强化学习算法的基础构件。rlax 基于 JAX,利用 JAX 的自动微分和加速计算功能,使得强化学习算法的实现更加高效和简洁。本文将详细…