组合设计模式解读

news2024/9/27 9:22:15

目录

问题引进

 传统方案解决学校院系展示存在的问题分析

组合模式基本介绍

基本介绍

组合模式原理类图

对原理结构图的说明-即(组合模式的角色及职责) 

应用实例

 组合模式的注意事项和细节


问题引进

看一个学校院系展示需求
编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院

传统方案解决学校院系展示(类图)

 传统方案解决学校院系展示存在的问题分析


1) 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
2) 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的管理的操作,比如对学院、系的添加,删除,遍历等
3) 解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 => 组合模式

组合模式基本介绍

基本介绍

1) 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以
表示“整体-部分”的层次关系。
2) 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
3) 这种类型的设计模式属于结构型模式。
4) 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象及组合对象

组合模式原理类图

对原理结构图的说明-即(组合模式的角色及职责) 

1) Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子部件, Component 可以是抽象类或者接口
2) Leaf : 在组合中表示叶子节点,叶子节点没有子节点
3) Composite :非叶子节点, 用于存储子部件, 在 Component 接口中实现 子部件的相关操作,比如增加(add),删除。

应用实例

应用实例要求
1) 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,
一个学院有多个系。
2) 思路分析和图解(类图
)

OrganizationComponent  

public abstract class OrganizationComponent {
    private  String name;//名字
    private  String des;// 说明

    protected  void  add(OrganizationComponent organizationComponent){
        throw  new UnsupportedOperationException();
    }

    protected  void  remove(OrganizationComponent organizationComponent){
        throw   new UnsupportedOperationException();
    }

    public OrganizationComponent(String name, String des) {
        this.name = name;
        this.des = des;
    }

    public String getName() {
        return name;
    }

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

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }
    protected  abstract  void print();
}

College  

public class College extends OrganizationComponent {
    //List 中 存放的 Department
    List<OrganizationComponent> list = new ArrayList<OrganizationComponent>();

    // 构造器
    public College(String name, String des) {
        super(name, des);

    }

    // 重写 add
    @Override
    protected void add(OrganizationComponent organizationComponent) {

        //将来实际业务中,Colleage 的 add 和 University add 不一定完全一样
        list.add(organizationComponent);
    }

    // 重写 remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        list.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    // print 方法,就是输出 University 包含的学院
    @Override
    protected void print() {
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (OrganizationComponent organizationComponent : list) {
            organizationComponent.print();
        }

    }
}

 University 

University 就是 Composite , 可以管理 College


public class University extends  OrganizationComponent{

   List<OrganizationComponent> list= new ArrayList<>();

    public University(String name, String des) {
        super(name, des);
    }

    @Override
    protected void print() {
        System.out.println("----------"+getName()+"------------");
        for (OrganizationComponent organizationComponent : list) {
           organizationComponent.print();
        }
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        list.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        list.remove(organizationComponent);
    }

}

 Department 

public class Department extends  OrganizationComponent{
    public Department(String name, String des) {
        super(name, des);
    }

    //没有集合

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public void setDes(String des) {
        super.setDes(des);
    }

    @Override
    protected void print() {
        System.out.println(getName());
    }
}

 client

public class client {
    public static void main(String[] args) {
        //从大到小创建对象 学校
        OrganizationComponent university = new University("清华大学", " 中国顶级大学 ");
        //创建 学院
        OrganizationComponent computerCollege = new College("计算机学院", " 计算机学院 ");
        OrganizationComponent infoEngineercollege = new College("信息工程学院", " 信息工程学院 ");
        //创建各个学院下面的系(专业)
        computerCollege.add(new Department("软件工程", " 软件工程不错 "));
        computerCollege.add(new Department("网络工程", " 网络工程不错 "));
        computerCollege.add(new Department("计算机科学与技术", " 计算机科学与技术是老牌的专业 "));

        infoEngineercollege.add(new Department("通信工程", " 通信工程不好学 "));
        infoEngineercollege.add(new Department("信息工程", " 信息工程好学 "));
        //将学院加入到 学校
        university.add(computerCollege);
        university.add(infoEngineercollege);
        university.print();

    }
}

 组合模式的注意事项和细节


1) 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
2) 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动.
3) 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构
4) 需要遍历组织机构,或者处理的对象具有树形结构时, 非常适合使用组合模式.
5) 要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式

 

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

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

相关文章

浏览器加 buff 指南-【超实用的浏览器工具】

今天这篇博客&#xff0c;说一说浏览器以及加 buff &#xff0c;先说浏览器&#xff1a;地址&#xff1a;https://www.xduoyu.com/&#xff0c;里面的工具让你的浏览器变装为技术人员的专属利器。这里还要表扬一下&#xff0c;官网的宣传页做的越来越专业了&#xff0c;还打造了…

好的台灯和差的台灯的区别?盘点高品质的护眼台灯品牌

简单来说&#xff0c;好的台灯使用20分钟不会眼疲劳&#xff0c;可差的台灯使用10分钟就眼干涩、不舒服了。 这些年的LED灯具都做得非常成熟&#xff0c;台灯也是LED灯具&#xff0c;在频闪、蓝光、显色指数、均匀度等各种指标都将眼睛保护的很好&#xff0c;采用特殊的光学技…

Thinkphp+vued大学生租房管理系统mysql校园房屋租赁网站系统

学生租房管理系统是计算机技术和网络迅速发展的一个大学生租房信息应用解决方案。大学生租房平台将Internet网络技术与现代管理观念相融合&#xff0c;针对信息技术的特点对大学生租房平台进行规划和重构&#xff0c;对大学生租房信息流进行优化及合理配置&#xff0c;生成动态…

VNC 远程重装 Centos 系统

一、环境 1、环境准备 两台设备&#xff0c;一台为重装 Centos 机器( IP&#xff1a;192.168.206.30&#xff0c;hostname&#xff1a;centos1) &#xff0c;确保 centos1本身开启了图形化界面GNOME&#xff0c;不是最小化安装的Linux 。一台为重装时&#xff0c;从获取安装程…

Django REST Framework(DRF)框架之视图集ViewSet与路由Router

DRF框架之视图集ViewSet 视图集ViewSet与路由Router视图集ViewSet路由Router视图集和路由的基本使用 视图集ViewSet的使用ViewSetGenericViewSetModelViewSetReadOnlyModelViewSet视图集添加其他方法视图集对象action属性 路由Router的使用SimpleRouterDefaultRouter基本使用自…

DELL R730 主板坏了,Raid5硬盘移到同型号服务器备忘

1、开机时按ctrlr进入raid设置页面 2、进入raid设置页面后可以看到没有找到虚拟磁盘&#xff0c;我们按F2打开操作菜单 3、选择菜单Foreign Config -> Import &#xff0c;选择Yes开始导入硬盘中的raid配置 4、导入成功的话就可以看到虚拟盘了 5、按Esc退出 6、按ctrlaltd…

为什么网络安全缺口很大,招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

迅为RK3568核心板车载中控AVM一体机应用

RK3568M车载中控&AVM一体机方案搭载4核A55 CPU&#xff0c;G52-2EE GPU架构&#xff0c;1Tops算力NPU&#xff0c;支持1路4K 60fps或8路1080P 30fps的多格式解码和高达1080P 100fps的H.265编码&#xff0c;具备双千兆GMAC、三路CAN以及USB3.0/SATA3.0/PCIE3.0等丰富接口&am…

Windows安装mysql详细步骤

目录 1 【确认本地是否安装mysql】 2【下载mysql安装包】 3【添加配置文件并安装mysql】 4【修改mysql密码】 5【配置环境变量】 windows 只安装mysql服务的操作 1 【确认本地是否安装mysql】 &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff…

java基于蚁群算法路由选择可视化动态模拟

蚁群算法是一种新生的算法&#xff0c;具有很强的通用性。从提出到现在&#xff0c;仅短短10余年的时间&#xff0c;但是在离散型组合优化问题中。表现很突出&#xff0c;所以一起人们的关注。目前蚁群算法的研究者主要集中在比利时、意大利、德国等国家&#xff0c;美国和日本…

Muduo 异步log的实现

1. logging 日志(logging) 有两个意思: 诊断日志: 即是我们日常debug 使用的文本文件记录trace。常用的log 有log4j, logback, log4cpp, ezlogger等常用的日志库。交易日志: 即是数据库的write-ahead log&#xff0c; 文件系统的journaling 等&#xff0c; 用于记录状态的变更…

软考 - IP地址与网络划分

一.IP组成 1.1 首个八位字节规则 1.2 地址掩码 IP地址掩码 标准地址掩码 A类&#xff1a;255.0.0.0 前1个字节是网络号 后3个字节是主机号 B类&#xff1a;255.255.0.0 前2个字节是网络号 后2个字节是主机号 C类&#xff1b;255.255.255.0 前3个字节是网络号 后1个字节是主机号…

nssctf web 入门(5)

这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;打算写10篇。 目录 [鹤城杯 2021]EasyP [SWPUCTF 2021 新生赛]eas…

VR全景--720全景 助力行业数字化新模式

引言 720全景就是视角超过人的正常视角的图像&#xff0c;而我们这里说的全景特指水平360度&#xff0c;上下360度全能观看的&#xff0c;能看到“天、地”的全景。全景实际上只是一种对周围景象以某种几何关系进行映射生成的平面图片&#xff0c;只有通过全景播放器的矫正处理…

电力监控系统高扩展性的设计思路与方法

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 电力监控软件的可扩展性设计 2023-04-19 14:00AcreXHJ 安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;本文根据安科瑞电力监控系统软件的设计过程&#xff0c;论述了电力监控系统高扩展…

JS 正则表达式(正则匹配RegExp)

JavaScript实现对象深拷贝的方法&#xff08;5种&#xff09; 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货举例引入关于RegExp对象语法修饰符——区分大小写和全局匹配方括号——查找某个范围内的字符元字符——拥有特殊含义的字符量词RegExp对…

4.Hadoop三件套(1)

如果说HDFS是存储,则Yarn就是cpu和内存,mapreduce就是程序。 1.HDFS文件块大小 HDFS中的文件在物理.上是分块存储(Block) ,block默认保存3份块的大小可以通过配置参数(dfs blocksize)来规定,默认大小在Hadoop2 .x版本中是128M,老版本中是64M。 解释:块的大小:10ms*100*…

代码随想录算法训练营第48天 | 动态规划 LeetCode198.打家劫舍,213.打家劫舍II,337.打家劫舍 III

代码随想录算法训练营第48天 | 动态规划 LeetCode198.打家劫舍&#xff0c;213.打家劫舍II&#xff0c;337.打家劫舍 III 198.打家劫舍 第一遍读题思考 dp[i]代表打劫到第i家的时候抢到的最多的钱数。 那么递推公式就跟dp[i-1] and dp[i-2]有关&#xff0c;如果抢i-1家的&am…

【梦回stm32】-寄存器篇-跑马灯代码研读-总结

前言&#xff1a;学就要学懂&#xff0c;别以为做出来就行&#xff0c;要弄懂通路&#xff0c;思路要清楚-谨记 1.先讲讲背景&#xff0c;此次需要研究的是stm32的跑马灯代码&#xff0c;下图是个本实验用的正点原子的代码目录 1&#xff09;HARDWARE-》LED 2&#xff09;SYS…

【COMP282 LEC 1-2】

LEC 1 Introduction to c Header file : 1. 不用写 " .h " Function : 数据类型有string了&#xff0c;就像java&#xff0c;需要#include<string> Output system : Explain by example: std::cout << hello << " is of length "…