组合模式详解

1、组合模式基本介绍

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

2、原理类图

在这里插入图片描述

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

3、应用实例

要求:

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

类图:

在这里插入图片描述

代码实现:

public abstract class OrganizationComponent {
    public String name;
    public String dsc;

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


    public String getName() {
        return name;
    }

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

    public String getDsc() {
        return dsc;
    }

    public void setDsc(String dsc) {
        this.dsc = dsc;
    }

    // 方法print,做成抽象的,子类都需要实现
    protected abstract void print();

    protected void add(OrganizationComponent organizationComponent){
        // 默认实现
        throw new UnsupportedOperationException();
    }

    protected void remove(OrganizationComponent organizationComponent){
        // 默认实现
        throw new UnsupportedOperationException();
    }
}
public class University extends OrganizationComponent{
    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

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

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

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

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }
}
public class College extends OrganizationComponent{
    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
    public College(String name, String dsc) {
        super(name, dsc);
    }

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

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

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }
}
public class Department extends OrganizationComponent{
    public Department(String name, String dsc) {
        super(name, dsc);
    }

    @Override
    protected void print() {
        System.out.println(getName());
    }
}
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();
    }
}

结果:

--------------清华大学--------------
--------------计算机学院--------------
软件工程
网络工程
计算机科学与技术
--------------信息工程学院--------------
通信工程
信息工程

进程已结束,退出代码0

4、在HashMap中的源码分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

类图:

在这里插入图片描述

5、注意事项和细节

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

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

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

相关文章

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode&#xff0c;My_HUD&#xff0c;My_PlayChar&#xff0c;My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机&#xff0c;角色骨骼网格体&#xff0c;武器骨骼网格体 编辑角色骨骼&#xff0c;预览控制器使用…

动静态IP地址多方面对比分析

“静态IP地址”和“动态IP地址”是互联网通信基础中的重要概念&#xff0c;两者作为IP地址分配的两种基本机制&#xff0c;各自适应不同的应用场景和需求。 我们可以从定义、地址分配机制、网络管理和运维、服务与应用兼容性等角度来分析有什么不同。 首先是定义。 从概念上来…

快速入门Tomcat服务(业务发布基础技能)

文章目录 1 Tomcat简介 2 安装tomcat 2.1 安装jdk 2.2 安装Tomcat 3 Tomcat目录结构 4 Tomcat重要配置文件 1 Tomcat简介 Tomcat是Sun公司官方推荐的Servlet和JSP容器&#xff0c;在中小型系统和并发访问用户不是很多的场合下&#xff0c;其作为轻量级应用服务…

解决无法安装“vue.volar“扩展,跟vscode版本不兼容问题

问题&#xff1a;安装volar插件的时候提示跟vscode版本不兼容 解决方案 1、进入VSCode插件市场&#xff0c;搜索Vue.volar&#xff08;直达链接&#xff1a;volar下载界面&#xff09; 2、点击download Extension&#xff08;下载插件&#xff09; 3、下载.vsix文件完成后&a…

Axure PR 9 开关切换 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们来探讨Axure开关按钮设计与交互技巧​。 创建切换开关所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.将“圆形”元件拖到画布上&#xff0c;在样式窗格中将高度和宽度设置为35&#xff0c;线段宽度…

HTMLCSS练习

1) 效果如下 2) 代码如下 2.1) HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…

图像处理(二)——MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Computer Vision and Image Processing, 2nd Edition 截止时间&#xff1a; 投稿截止日期&#xff1a;2024年12月31日 目标及范围&#xff1a; 感兴趣的主题包括但不限于&#xff1a; 用于图像分类和识别的深度学习 对象检测和跟…

浙江省发规院产业发展研究所调研组莅临迪捷软件考察调研

2024年10月10日下午&#xff0c;浙江省发展与规划院产业发展研究所调研组一行莅临迪捷软件考察调研&#xff0c;绍兴市府办、区发改、区经信、迪荡街道等相关领导陪同。 调研组一行参观了迪捷软件的展厅与办公区&#xff0c;深入了解了迪捷软件的公司发展历程、运营状况、产品…

ECCV`24 | 新加坡国立华为提出Vista3D: 实现快速且多视角一致的3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2409.12193 gitbub链接&#xff1a;https://github.com/florinshen/Vista3D 亮点直击 提出了Vista3D&#xff0c;一个用于揭示单张图像3D darkside 的框架&#xff0c;能够高效地利用2D先验生成多样的3D物体。开发了一种从高斯投影到…

tauri开发Mac电脑Safari浏览器一个很奇怪的问题:在 input 输入框输入的是全小写英文字母,会自动将首字母转换为大写解决办法

问题原因 在 Mac 系统中默认使用 Safari 的内核 WKWebView 作为渲染引擎&#xff0c;而 Safari 浏览器的一些 “人性化” 机制&#xff1a;如果输入框中输入的是全小写英文&#xff0c;会自动将首字母转换为大写。 解决办法 我只需要禁止这个默认的行为&#xff0c;即可解决这…

【js逆向学习】极志愿 javascript+python+rpc

JSRPC使用方式 逆向目标逆向过程逆向分析1、什么是 websocket2、websocket的原理3、总体过程3.1 环境说明3.2 python服务端代码3.3 python客户端代码 4、Sekiro-RPC4.1 执行方式4.2 客户端环境4.3 参数说明4.4 SK API4.5 python代码调试4.6 代码注入流程 逆向总结 逆向目标 网…

物联网智能项目(含案例说明)

物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;智能项目是指利用物联网技术将各种物理设备、传感器、软件、网络等连接起来&#xff0c;实现设备之间的互联互通&#xff0c;并通过数据采集、传输、处理和分析&#xff0c;实现智能化管理和控制的项目。以…

三品PLM系统赋能中小企业实现数字化转型迈向管理智能化

在全球化的浪潮中&#xff0c;发达国家的企业在管理体系上更具优势&#xff0c;常采用先进的PLM体系提升运营和战略规划效率。相较之下&#xff0c;国内中小企业在PLM系统的应用上明显滞后&#xff0c;中高层管理人员普遍缺乏相应的认知与实践经验&#xff0c;这限制了企业的创…

【命令操作】查看和分析系统各类日志--journalctl

原文链接&#xff1a;【命令操作】查看和分析系统各类日志–journalctl | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于Linux系统上journalctl命令详解的文章。journalctl是systemd的日志查看工具&#xff0c;用于查看和管理系统日志&…

Windows系统编程 - 目录操作、磁盘、卷信息

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解Windows系统编程的相关知识:目录操作 目录 目录操作 创建目录 通过CreateDirectory函数创建目录 原型: BOOL CreateDirectoryA([in] LPCSTR lpPathName,//目录名称[in, opt…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统&#xff0c;其架构具有以下特点&#xff1a; 一、客户端/服务器架构 客户端 客户端可以是各种应用程序&#xff0c;如 Web 应用、桌面应用等&#xff0c;它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

PHP:下拉列表,颜色展示

PHP展示下拉列表&#xff0c;选项设置为数据库存储颜色进制&#xff0c;colorname是颜色名称&#xff0c;color是颜色进制 一、表结构 produce_info_nav1_colorshow produce_info_nav1 二、核心代码 //查询对应默认颜色 $sql_selcolor "SELECT color FROM produce_i…

List子接口

1.特点&#xff1a;有序&#xff0c;有下标&#xff0c;元素可以重复 2.方法&#xff1a;包含Collection中的所有方法&#xff0c;还包括自己的独有的方法&#xff08;API中查找&#xff09; 还有ListIterator&#xff08;迭代器&#xff09;&#xff0c;功能更强大。 包含更多…

使用超低功耗TinyML模型检测聋哑人士的手势语言

论文标题&#xff1a;Detecting Gesture Language for Deaf and Mute People Using Ultra-Low-Power TinyML Model 作者信息&#xff1a; Basel A. Dabwan&#xff0c;来自也门Albaydha的Albaydha University的信息系统系。Mukti E. Jadhav&#xff0c;来自印度Buldhana区Chi…

HFSS 教程之材料添加

在用HFSS做仿真时&#xff0c;会用到多种材料&#xff0c;其材料库中的材料是有限的&#xff0c;有时仿真对象零件所用的材料并不包含在其材料库中&#xff0c;这时就需要新加材料。HSS自带的材料库&#xff0c;我们称之为系统材料库&#xff0c;新加的材料不能存入系统材料库中…