组合模式详解

news2024/11/30 4:55:19

简介:就是树状图结构的多个类

  • Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。

  • Leaf(叶子构件):它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。

  • Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。

 

package composite;


import java.security.Provider;
import java.util.ArrayList;
import java.util.List;

//总公司-分公司-部门
public class Make {
    public static void main(String[] args) {
        ConcreteCompany root = new ConcreteCompany("沈阳总公司");
        root.Add(new HRDepartment("总公司人力资源部"));
        root.Add(new FinanceDepartment("总公司财务部"));

        ConcreteCompany anshan = new ConcreteCompany("鞍山分公司");
        root.Add(anshan);
        anshan.Add(new HRDepartment("鞍山分公司人力资源部"));
        anshan.Add(new FinanceDepartment("鞍山分公司财务部"));


        ConcreteCompany fushun = new ConcreteCompany("抚顺分公司");
        root.Add(fushun);
        fushun.Add(new HRDepartment("抚顺分公司人力资源部"));
        fushun.Add(new FinanceDepartment("抚顺分公司财务部"));

        System.out.println("结构图:");
        root.Display(1);
        System.out.println("职责:");
        root.LineOfDuty();

        /**
         * 结构图:
         * -沈阳总公司
         * ---总公司人力资源部
         * ---总公司财务部
         * ---鞍山分公司
         * -----鞍山分公司人力资源部
         * -----鞍山分公司财务部
         * ---抚顺分公司
         * -----抚顺分公司人力资源部
         * -----抚顺分公司财务部
         * 职责:
         * 总公司人力资源部员工招聘培训管理
         * 总公司财务部公司财务收支管理
         * 鞍山分公司人力资源部员工招聘培训管理
         * 鞍山分公司财务部公司财务收支管理
         * 抚顺分公司人力资源部员工招聘培训管理
         * 抚顺分公司财务部公司财务收支管理
         */

    }
}


//抽象公司类
abstract class Company {
    String name;

    public Company(String name) {
        this.name = name;
    }
    public abstract void Add(Company c);//添加 枝杈 或者 叶子
    public abstract void Remove(Company c);//移除 枝杈 或者 叶子
    public abstract void Display(int depth);//显示
    public abstract void LineOfDuty();//履行职责
}

//公司类 (枝杈)
class ConcreteCompany extends Company {

    private List<Company> children = new ArrayList<>();

    public ConcreteCompany(String name) {
        super(name);
    }

    @Override
    public void Add(Company c) {
        children.add(c);
    }

    @Override
    public void Remove(Company c) {
        children.remove(c);
    }

    @Override
    public void Display(int depth) {
        System.out.print("-");
        for(int i = 1; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(this.name);
        for (Company c:children) {
            c.Display(depth + 2);
        }
    }

    @Override
    public void LineOfDuty() {
        for (Company c:children) {
            c.LineOfDuty();
        }
    }
}

//部门类 (叶子)
class HRDepartment extends Company {

    public HRDepartment(String name) {
        super(name);
    }

    @Override
    public void Add(Company c) {

    }

    @Override
    public void Remove(Company c) {

    }

    @Override
    public void Display(int depth) {
        for(int i = 1; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println("-" + this.name);
    }

    @Override
    public void LineOfDuty() {
        System.out.println(this.name + "员工招聘培训管理");
    }
}

//部门类 (叶子)
class FinanceDepartment extends Company {
    public FinanceDepartment(String name) {
        super(name);
    }

    @Override
    public void Add(Company c) {

    }

    @Override
    public void Remove(Company c) {

    }

    @Override
    public void Display(int depth) {
        for(int i = 1; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println("-" + this.name);
    }

    @Override
    public void LineOfDuty() {
        System.out.println(this.name + "公司财务收支管理");
    }
}

缺点:

组合模式的主要缺点如下:

  • 破坏了“单一职责原则”。

  • 在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。

优点

组合模式的主要优点如下:

  • 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。

  • 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。

  • 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。

  • 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的

适用环境

在以下情况下可以考虑使用组合模式:

  • 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。

  • 在一个使用面向对象语言开发的系统中需要处理一个树形结构。

  • 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

  • 树形结构,但对树形结构的控制却非常简单。

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

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

相关文章

常见react面试题

React组件命名推荐的方式是哪个&#xff1f; 通过引用而不是使用来命名组件displayName。 使用displayName命名组件&#xff1a; export default React.createClass({ displayName: TodoApp, // ...})React推荐的方法&#xff1a; export default class TodoApp extends …

【实时数仓】CDC简介、实现DWD层业务数据的处理(主要任务、接收kafka数据、动态分流*****)

文章目录一 CDC简介1 什么是CDC2 CDC的种类3 Flink-CDC二 准备业务数据-DWD层1 主要任务&#xff08;1&#xff09;接收Kafka数据&#xff0c;过滤空值数据&#xff08;2&#xff09;实现动态分流功能&#xff08;3&#xff09;把分好的流保存到对应表、主题中2 接收Kafka数据&…

VCL界面组件DevExpress VCL v22.1 - 支持新的格式标签和矢量图标

DevExpress VCL是Devexpress公司旗下最老牌的用户界面套包&#xff0c;所包含的控件有&#xff1a;数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验&#xff0c;提供高影响力的业务解决方案&#xff0c;并利用您现有的VCL技能为未来构建下一代应用程…

Altium Designer 22 安装过程

Altium Designer 22 安装过程1、开始安装 Altium Designer&#xff0c;点击 Next 2、选择需要安装的语言&#xff0c;勾选上接受协议&#xff0c;然后点击 Next 3、默认即可&#xff0c;其中 Touch Sensor Support 主要是用于触摸屏&#xff0c;然后点击 Next 4、接着&#xff…

C#语言实例源码系列-实现自己的进程管理器

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

CENTO OS上的网络安全工具(十七)搭建Cascade的Docker开发环境

这一篇&#xff0c;我们继续在Docker上折腾。之前我们已经展示了如何在容器上搭建安全产品的部署环境&#xff0c;这里我们需要更进一步&#xff0c;讨论如何在容器上搭建开发与调试环境。这是学习安全产品并且自己构建安全产品的基础步骤。 一、 构建开发镜像 鉴于前期我们…

如何使用 AWS 和 ChatGPT 创建最智能的多语言虚拟助手

上周ChatGPT发布了&#xff0c;每个人都在尝试令人惊奇的事情。我也开始使用它并想尝试它如何使用AWS的AI 服务进行集成&#xff0c;结果非常棒&#xff01; 在这篇文章中&#xff0c;我将逐步解释我是如何创建这个项目的&#xff0c;这样你也可以做到&#xff01; 最重要的是…

Tuxera NTFS2023免费版Mac电脑系统读写软件

使用 Mac 的巨大痛点之一&#xff1a;移动硬盘只能打开文件&#xff0c;但是无法写入新的资料ntfs。有人说格式化硬盘&#xff0c;改成苹果的 macOS扩展格式&#xff0c;但是原先硬盘的数据要转移&#xff0c;而且拿到 Windows 系统里无法被识别。 有人说格式化硬盘&#xff0…

C++ Reference: Standard C++ Library reference: Containers: list: list: emplace

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/emplace/ 公有成员 <list> std::list::emplace template <class... Args> iterator emplace (const_iterator position, Args&&... args);构造并插入元素 通过在position上插入一个…

SpringMVC+SSM整合(完整版)

文章目录一、SpringMVC&#xff08;一&#xff09;SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点4、MVC的工作流程&#xff08;二&#xff09;入门案例1、创建maven工程①引入依赖②配置web.xml③扩展配置方式2、总结&#xff08;三&#xff09;RequestMappi…

大学生个人网页模板 简单网页制作作业成品 极简风格个人介绍HTML网页设计代码下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

TZ-PEG-N3 四嗪聚乙二醇叠氮 Tetrazine-PEG-azide

四嗪可用于许多生物成像和生物共轭应用的生物正交反应。目前被广泛应用于蛋白质特定位点功能阐释、亚细胞结构选择性标记、药物靶向传递、活体动物分子影像和生物兼容性材料的制备等。 产品名称 Tetrazine-PEG-N3 四嗪聚乙二醇叠氮 中文名称 四嗪聚乙二醇叠氮 英文名称 …

[附源码]Nodejs计算机毕业设计基于Web的摄影爱好者交流社区Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

java计算机毕业设计ssm在线学习交流平台97t28(附源码、数据库)

java计算机毕业设计ssm在线学习交流平台97t28&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

[附源码]Python计算机毕业设计SSM基于web的教学资源管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

sql错误分析--SQLSyntaxErrorException-

### Error updating database-----指数据库database update错误. Cause: java.sql.SQLSyntaxErrorException--sql语法错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near > 2…

微信公众号开发——向指定用户发送模板消息

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; 微信公众号开发——向指定用户发送模板消息⏱️ 创作时间&#xff1a; 20…

ArrayList源码解析与相关知识点

ArrayList源码解析于相关知识点&#xff08;超级详细&#xff09; 文章目录ArrayList源码解析于相关知识点&#xff08;超级详细&#xff09;ArrayList的继承关系Serializable标记接口Cloneable标记接口RandomAccess标记接口AbstractList类属性构造函数无参构造函数指定初始容量…

网络工程毕业设计 SSM疫情期间医院门诊管理系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统开发流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的疫情…

测试人生 | 转行测试开发,4年4“跳”年薪涨3倍,我的目标是星辰大海(附大厂面经)!

image1080500 66.1 KB 编者按&#xff1a;本文来自霍格沃兹测试学院优秀学员 TesterC&#xff0c;**从运营岗位转行外包测试&#xff0c;再到测试开发&#xff0c;从待业在家到4年4“跳”进入 BAT 大厂&#xff0c;年薪涨了3倍&#xff01;**他是如何完成如此励志的华丽转身的…