【结构型模式】组合模式

news2024/12/23 22:49:14

一、组合模式概述

        组合模式的定义与意图将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。(对象结构型)

  • 组合模式分析
    • 1.当容器对象的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理;
    • 2.由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使程序非常复杂。
  • 如何一致地对待容器对象和叶子对象?
    • 组合模式通过一种巧妙地设计方案使得用户可以一致性地处理整个树形结构或者树形结构地一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它进行区分,可以一致地对待容器对象和叶子对象。
  • 安全组合模式
    • 1.抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法;
    • 2.对于叶子对象,客户端不可能调用到这些方法;
    • 3.缺点是不够透明,客户端不能完全针对抽象编程。必须有区别地对待叶子构件和容器构件。
  • 透明组合模式
    • 1.抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove()、以及getChild()等方法;
    • 2.在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以一致地对待所有的对象;
    • 3.缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的。
  • 组合模式的优缺点
    • 优点
      • 1.可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构将进行控制;
      • 2.客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码;
      • 3.增加新的容器构件和叶子构件都很方便,符合开闭原则;
      • 4.为树形结构的面向对象实现提供了一种灵活的解决方案。
    • 缺点
      • 在增加新构件时很难对容器中的构件类型进行限制。
  • 适用环境
    • 1.在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待他们;
    • 2.在一个使用面向对象语言开发的系统中需要处理一个树形结构;
    • 3.在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

二、代码实现

        组合模式的结构:

  • Component(抽象构件)
  • Leaf(叶子构件)
  • Composite(容器构件)

        某教育机构组织结构如下图所示:

        在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。

        2.1 Component(抽象构件类:AbstractHead)
package composite.OAteacher;
//(1)Component抽象构件类:AbstractHead
public abstract class AbstractHead {
	public abstract void receiveDocument();
}
        2.2 Leaf(叶子构件:AdminOffice、ProvostOffice)
package composite.OAteacher;
//(2.1)Leaf叶子构件类:AdminOffice
public class AdminOffice extends AbstractHead {	
	private String officeName;	
	public AdminOffice(String officeName){
		this.officeName = officeName;
	}	
	public void receiveDocument(){
		System.out.println(officeName + "收到文件");
	}
}
package composite.OAteacher;
//(2.2)Leaf叶子构件类:ProvostOffice
public class ProvostOffice extends AbstractHead {
	
	private String officeName;	
	public ProvostOffice(String officeName){
		this.officeName = officeName;
	}	
	public void receiveDocument(){
		System.out.println(this.officeName + "收到文件...");
	}	
}
        2.3 Composite(容器构件:Branch,定义构件行为)
package composite.OAteacher;

import java.util.*;
//(3)composite:定义组件行为,比如下发文件动作
public class Branch extends AbstractHead {	

	private String branchName;
	ArrayList list = new ArrayList();	

	public Branch(String branchName){
		this.branchName = branchName;
	}	
	public void addSubOrg(AbstractHead elment){
		list.add(elment);
	}	
	public void removeSubOrg(AbstractHead element){
		list.remove(element);
	}	
	public void receiveDocument(){		
		System.out.println("-----------------------------------------");
		for(Object object: list){
			//System.out.println(object.getClass());
			if(object.getClass().toString().equals("class Branch"))
			{				
				((Branch)object).issudedDocument();
			}
			else
				((AbstractHead)object).receiveDocument();			
		}		
	}
	public void issudedDocument(){
		System.out.println(branchName + "下发文件......");
		this.receiveDocument();
	}
}
        2.4 main方法实现组合模式
package composite.OAteacher;
//(5)客户端测试类:Client
/*
 * 题目:
某教育机构组织结构如下图所示:
在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
 */
public class Client {	
	public static void main(String args[]){	
	
		AbstractHead office11 = new ProvostOffice("长沙教学点教务办公室");
		AbstractHead office12 = new ProvostOffice("长沙教学点行政办公室");
		Branch b1 = new Branch("长沙教学点");
		b1.addSubOrg(office11);
		b1.addSubOrg(office12);
		
		AbstractHead office21 = new ProvostOffice("湘潭教学点教务办公室");
		AbstractHead office22 = new ProvostOffice("湘潭教学点行政办公室");
		Branch b2 = new Branch("湘潭教学点");
		b2.addSubOrg(office21);
		b2.addSubOrg(office22);
		
		AbstractHead office31 = new ProvostOffice("湖南分校教务办公室");
		AbstractHead office32 = new ProvostOffice("湖南分校行政办公室");
		Branch b3 = new Branch("湖南分校");
		b3.addSubOrg(office31);
		b3.addSubOrg(office32);
		b3.addSubOrg(b1);
		b3.addSubOrg(b2);
		
		AbstractHead office41 = new ProvostOffice("北京总部教务办公室");
		AbstractHead office42 = new ProvostOffice("北京总部行政办公室");
		Branch b4 = new Branch("北京总部");
		b4.addSubOrg(office41);
		b4.addSubOrg(office42);
		b4.addSubOrg(b3);
		
		b4.issudedDocument();
		//b4.receiveDocument();		
	}
}
        2.5 UML图

三、代码结构图

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

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

相关文章

鸿蒙入门02-首次安装和配置

注:还没有安装编辑器( deveco studio )的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器( deveco studio )安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置&#xf…

js处理给标题添加搜索词高亮,标题不包含内容包含的拼接内容包含字样

项目场景: 在项目中我们经常会写搜索,搜索后显示的数据要么标题包含搜索词要么内容包含搜索词,所以我们需要写出下面的效果! 问题描述 数据是后台给的,标题内容是文字样式,所以我们需要在请求完数据后,给…

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD...,无法按下任何按键

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD…,无法按下任何按键 在显示这个界面之后点击启动,之后立刻狂按F2, 然后就能进去了

Jenkins打包app并通过openssh上传到服务器

1、下载安装openssh 网上很多教程,包括开端口的,可以搜下 2、配置openssh根目录 进入C:\ProgramData\ssh打开文件sshd_config,添加配置ChrootDirectory D:\wxs\soft,想改端口的也在这个文件 3、安装Jenkins 参考上一篇 4、新…

Covalent Network(CQT)宣布推出面向 Cronos 生态的捐赠计划与 API 积分,为 Web3 创新赋能

为了促进 Web3 领域的创新,Covalent Network(CQT)宣布将其捐赠计划向 Cronos 生态系统中的开发者拓展。这一战略性举措,旨在通过向 Cronos 网络中基于 Covalent Network(CQT)API 构建的项目提供支持和资源&…

jenkins通过pipeline部署springboot项目

部署方案: 1、springboot项目不保存部署的pipeline或dockerfile构建脚本等与部署相关的问文件,业务项目只需关心业务,能够正常构建为jar包即可 2、新建一个代码仓库,用于保存项目需要构建的Jenkinsfile 3、jenkins配置pipeline地址…

一文了解OCI标准、runC、docker、contianerd、CRI的关系

docker和contanerd都是流行的容器运行时(container runtime);想讲清楚他们两之间的关系,让我们先从runC和OCI规范说起。 一、OCI标准和runC 1、OCI(open container initiative) OCI是容器标准化组织为了…

【C++】力扣OJ题:构建杨辉三角

Hello everybody!今天给大家介绍一道我认为比较经典的编程练习题&#xff0c;之所以介绍它是因为这道题涉及到二维数组的构建&#xff0c;如果用C语言动态构建二维数组是比较麻烦的&#xff0c;而用C中STL的vector<vector<int>>,就可以立马构建出来&#xff0c;这也…

【前端】2. HTML综合案例

1. 展示简历信息 代码如下&#xff1a;可自行发挥 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个…

【C++学习】map和set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set 4.1 set的介绍 4.2 set的使用 4.2.1 set的模板参数列表 4.2.2 set的构造 4.2.3 set的容量 4.2.4 set修改操作 4.2.5 set的使用举例 五、map 5.1 map的介绍 5.2 map的使用 5.2.1 map的模板参数说…

高级感拉满的个人UI网页

效果图 PC端 移动端 部分代码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>Zboy的主页</title><link rel"stylesheet" href"css/normalize.css" /><link rel&qu…

C语言-输入数,存入数组,将奇数放置数组左侧,将偶数放置数组右侧

一 主要涉及到的知识点: 1.1 for循环 1.2 计算数组的大小int sz sizeof(arr) / sizeof(arr[0]); 1.3 函数的定义使用 1.4 while()循环 二 源代码: //输入一个整数数组,实现一个函数 //来调整该数组中数字的顺序使得数组中所有的奇数位与数组的前半部分, //所有的偶数位于…

Springboot+Vue项目-基于Java+MySQL的蜗牛兼职网系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

7.C++:多态

一、 virtual关键字 //1.可以修饰原函数&#xff0c;为了完成虚函数的重写&#xff0c;满足多态的条件之一&#xff1b; //2.可以在菱形继承中&#xff0c;完成虚继承&#xff0c;解决数据冗余和二义性&#xff1b; 两个地方使用同一关键字&#xff0c;但二者间没有一点关联 二…

鸿蒙入门04-真机运行“遥遥领先”

如果你有一台真的 "遥遥领先"那么是可以直接在手机上真机运行你的项目的我们也来尝试一下运行 一、手机设置开发者模式 打开手机设置 打开手机设置界面 向下滑动到关于手机位置 快速连续点击版本号位置 下图所示位置快速连续点击 打开 3 - 5 次即可 会提示您已经进…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

负载均衡集群——HAProxy

目录 1 HAProxy介绍 2 功能简介 3 实验组网介绍 4 实验步骤 4.1 通过 HAProxy 实现简单负载均衡调度功能 步骤 1 安装 HAProxy 步骤 2 修改配置 HAProxy 文件 4.2 HAProxy 监控页面配置 步骤 1 修改 HAProxy 配置文件 步骤 2 查看监控页面 3.3 HAProxy 日志相关配置 …

超详细!Python中 pip 常用命令

相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了解可能还不一定是非常的透彻&#xff0c;今天小编就来为大家介绍10个使用pip的小技巧&#xff0c;相信对大家以后管理和使用Python当中的标准库会有帮助。 安装 当然在…

论文解读:FREE LUNCH FOR FEW-SHOT LEARNING: DISTRIBUTION CALIBRATION

文章汇总 问题 学习到的模型很容易因为只有少数训练样本形成的有偏分布而变得过拟合。 动机 我们假设特征表示中的每个维度都遵循高斯分布&#xff0c;因此分布的均值和方差可以借鉴类似类的均值和方差&#xff0c;这些类的统计量可以通过足够数量的样本得到更好的估计。 …

PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

[题目信息]&#xff1a; 题目名称题目难度PHP反序列化命令执行1 [题目考点]&#xff1a; 反序列化命令执行&#xff0c;获取题目flag。[Flag格式]: SangFor{t5euvZ_OB8Jd_h2-}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 docker-compose up …