[DP]Composite设计模式

[设计模式](八):组合模式(Composite)与享元模式(Flyweight)详解 组合模式(Composite)与享元模式(Flyweight) 阅读详情

我们的KFG餐厅非常的big,非常的有逼格。

但是我们这里带来一个问题,你作为CEO是不可能管理本集团内所有人的。

遥想当初我们幸幸苦苦开了第一家店,那个时候 你作为店长 管理着手下不多的几个员工。

然后我们在有了第二家店,第三家,在某个城市 你作为这个城市的负责人 管理下属的所有员工。

然后我们公司越来越大,已经在华北地区形成了不小的影响,而你作为整个华北地区的负责人,管理着个个城市的负责人。

随着我们的共同努力,公司称霸全国。而你作为ceo则是管理各个地区的负责人。

好了现在问题来了,要解决上述这种树形结构的员工管理树,该如何实现。


注意我这里用圆角方框 和方框 将以上的员工 分成两类,一类是 管理人员(圆角方框),另外一类则是我们的标准的普通员工,它们都是员工,ceo也不例外,要说ceo为谁打工,为了自己呗。

abstract class Staff {
	private String name;
	private String postion;

	public Staff(String name, String postion) {
		this.name = name;
		this.postion = postion;
	}

	public String getName() {
		return name;
	}

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

	public String getPostion() {
		return postion;
	}

	public void setPostion(String postion) {
		this.postion = postion;
	}

	abstract public void doWork();

	public void hireStaff(Staff staff) {
	}

	public void fireStaff(Staff staff) {
	}
}

class Magnager extends Staff {

	private List<Staff> staffs = new LinkedList<>();

	public Magnager(String name, String postion) {
		super(name, postion);
	}

	@Override
	public void doWork() {
		System.out.println("im counting sheet.");
	}

	@Override
	public void hireStaff(Staff staff) {
		staffs.add(staff);
	}

	@Override
	public void fireStaff(Staff staff) {
		staffs.remove(staff);
	}
}

class NormalStaff extends Staff {

	public NormalStaff(String name, String postion) {
		super(name, postion);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void doWork() {
		System.out.println("im doing some work.");
	}
}

这样我们就可以管理多级员工的问题了。当然你要说你既担任ceo,同时管理 负责人 和普通员工 都是没有任何问题的。

public class Composite {
	public static void main(String[] args) {
		//我们的ceo 出场了
		Staff ceo = new Magnager("HeapStackk", "ceo");
		//但是只有ceo 我们不就成了光杆司令,所以我们得找到一个华东地区负责人
		Staff huaDongAreaDirector = new Magnager("huadong", "director");
		ceo.hireStaff(huaDongAreaDirector);
		//华东地区负责人说,不行 我也要找人帮我打下手
		Staff nanjingAreaDirector = new Magnager("nanjing", "director");
		huaDongAreaDirector.hireStaff(nanjingAreaDirector);
		//然后南京的负责人 就雇佣了一名店长…… 然后店长管理其员工
		Staff KFGDianZhang = new Magnager("dianzhang", "dianzhang");
		nanjingAreaDirector.hireStaff(KFGDianZhang);
		//我们的南京负责人 表示对店长不满意 所以我要炒你鱿鱼
		nanjingAreaDirector.fireStaff(KFGDianZhang);
		//我们的ceo表示 好无聊,不如我也自己直接参与一家店 做一个店长 雇佣人吧。
		Staff cleaner = new NormalStaff("haha", "cleaner");
		ceo.hireStaff(cleaner);
	}
}

纵观上述过程,我们需要将该种设计模式抽象出来,使的具有通性。


构建模式的组成
          抽象构件角色(component):是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。这个接口可  以用来管理所有的子对象。(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。  
          树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为。
          树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。
          客户角色(Client):通过component接口操纵组合部件的对象。   

在上述例子中:

          抽象构建角色:Staff 无论是管理者 还是普通的员工都是员工。提供了管理员工的接口。

          树叶构建角色:NormalStaff 实际上并没有子节点,虽然提供了雇用方法,然并没什么卵用。

          树枝构建角色:Manager 能够存储子部件,就是手下多少个员工。

         客户角色:这个里面并没有明确。


效果
     1) • 定义了包含基本对象和组合对象的类层次结构 基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到   基本对象的地方都可以使用组合对象。
     2) • 简化客户代码 客户可以一致地使用组合结构和单个对象。通常用户不知道 (也不关心)处理的是一个叶节点还是一个组合组件。这就简化了客户代码 , 因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。
    3) • 使得更容易增加新类型的组件 新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需因新的Component类而改变。
    4) • 使你的设计变得更加一般化 容易增加新组件也会产生一些问题,那就是很难限制组合中的组件。有时你希望一个组合只能有某些特定的组件。使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查。



适用性
以下情况下适用Composite模式:
1).你想表示对象的部分-整体层次结构
2).你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


spring中暂时未读到疑似composite设计模式的代码案例。


计算机考研考博经典考题汇总(一次刷新世界观-我相信VIP总是有原因的) 操作系统 操作系统的特点? – 共享:资源可被多个并发执行的进程使用 – 并发:可以在同一时间间隔处理多个进程,需要硬件支持 – 虚拟:将物理实体映射成为多个虚拟设备 – 异步:进程执行走走停停,每次进程执行速度可能不同,但OS需保证进程每次执行结果相同 进程的三个组成部分? 程序段、数据段、PCB(Process Control Block) 并发与并行区别? 并发:同一间隔 并行:同一时刻 进程切换的过程? 保持处理机上下文 -> 更新PCB -> 把PCB移入相应队列(就绪、阻塞) -&g 阅读详情

相关推荐

GraphRAG 与 HippoRAG 深度对比:在 RAGFlow 中如何选择知识图谱方案?

本文深入对比了GraphRAG与HippoRAG在RAGFlow中的知识图谱构建方案,分析了两者在技术架构、资源消耗和场景适配性上的核心差异。GraphRAG适合需要快速响应和资源有限的场景,而HippoRAG则更适用于精确关系推理的专业领域。文章还提供了RAGFlow的演进路线和选型决策框架,帮助架构师根据实际需求做出合理选择。

weixin_27889245的博客 246

DP协议学习笔记

DP协议学习笔记1 术语1.1 AUX Channel-辅助通道1.2 DPCD1.3 MSA和SDP2 连接时序2.1 HPD2.2 读取EDID2.3 Link Training(DPCD)2.4 HDCP 1 术语 1.1 AUX Channel-辅助通道 DP设有专用总线,即AUX Channel,用于source和sink之间的握手。因为source是过程的控制装置,它为sink提出请求。sink与source进行通信的唯一途径是在热插拔检测(HPD)信号中发出一个脉冲。 因为AUX Channe

qq_22326895的博客 2万+

26 硬件工程师笔面试高频考点真题解析——CAN总线

CAN总线是一种差分多主串行半双工总线,采用非破坏性位仲裁机制和五层硬件错误检测(位错误、填充错误、CRC校验、格式错误、应答错误),具有高可靠性和故障容错能力。关键设计包括两端120Ω终端电阻匹配阻抗、手拉手总线拓扑、显性/隐性电平优先级仲裁。常见故障分析指出多节点异常多因终端电阻错配/漏装、星型布线违规或总线过载;高速通讯失败常由阻抗失配或线缆过长导致信号反射。相比RS485,CAN支持多主架构、硬件自动仲裁和节点故障隔离,更适用于汽车、工业等高可靠场景。

XU157303764的博客 544

DP/eDP协议学习--屏幕自刷新PSR

屏幕自刷新 对于source和sink来说,PSR属于可选功能。如果要实现PSR,双方都应该支持。自刷新的目的就是降低系统功耗,而且是eDP嵌入式应用最主要的节省功耗的方式。并且效果明显,当需要长时间显统一帧的时候就可以使用此功能。但是目前市面上支持自刷新的屏幕很少。据反映系统做的也不好,容易闪屏。但是这个功能真的不错,希望以后该应用能广泛应用。 下图为子刷新的状态转移图,这个图不是控制器要实现的,而是系统要实现子刷新的步骤。这里需要强调的是: A Source must not send more tha

jiuyuetingyue的博客 9934

CNN经典网络模型(二):AlexNet简介及代码实现(PyTorch超详细注释版)

CNN经典网络模型之一:AlexNet,本文包含其简介及代码,在PyTorch中实现,进行超详细注释,适合新生小白阅读学习~

qq_43307074的博客 2万+

【数学基础】基于欧拉角表达的旋转顺序

欧拉角旋转顺序

FalschxMico 1384

c++设计模式----组合模式(Composite)

什么是组合模式呢?                                 DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,

chen 1823

补洞与fairing算法

对网格进行补洞,remesh, 平滑,fairing, 最小二乘优化平滑

闪电彬彬的博客 1047

设计模式:组合(Composite)模式

设计模式:组合(Composite)模式 一、前言 关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序的,肯定少不了定义一些组件,初始化之后,然后使用容器的add方法,将这些组件有顺序的组织成一个界面出来;或者读者如果编写过前端的页面,肯定使用过<div>等标签定义一些格式,然后格式之...

weixin_30588675的博客 93

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX + CMSIS-DSP 手动添加、库添加方式

CMSIS-DSP库在工程中应用遇到的所有问题进行归纳终结

洋洋的博客 1万+

【Q1/论文复现】:利用 CHARLS 数据库考察抗高血压药物依从性和认知衰退

摘要: 北京大学团队基于CHARLS数据(2011-2018)的纵向研究发现,抗高血压药物高依从性能显著延缓中国45岁及以上社区中老年人的认知衰退。研究表明,坚持服药者7年内全局认知衰退速度降低0.014SD/年,记忆功能衰退减缓0.023SD/年,效果接近正常血压人群水平。研究还提示社会经济地位(SES)可能通过影响用药依从性间接调控认知衰老进程。该成果为高血压管理对认知保护提供了人群级证据,发表于《BMC Medicine》(DOI:10.1186/s12916-025-03949-8)。

dingdianbangni的博客 809

DP-组合模式(Composite Pattern)

组合模式(Composite Pattern) ——.NET设计模式系列之十一 Terrylee,2006年3月 概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得...

weixin_30619101的博客 109

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

[设计模式] 8 组合模式 Composite

DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,不论是子公司,还是直属的财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树...

weixin_34044273的博客 106

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式的比喻

着楼主的帖子,在心里把GOF DP又过了一遍,感觉这种方式来学习DP很可取,不拘泥于具体而着重于思想。里面的一些内容个人觉得有些地方不太恰当,提出来供参考:创建型模式1、FACTORY—人才市场:以往是要哪个人才,就找哪个人才,效率低,现在有了人才市场,我们只需直接去人才市场挑一个好了;--人市换成猎头公司如何? 2、BUILDER—生产流水线:以前是手工业作坊式的人工单个单个的生产零件然后一步一

§为艺术而技术§ 1255

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式学习—组合实体模式(Composite Entity Design Pattern)

设计模式之组合实体模式,一种JavaEE模式

闲鱼的博客 1977

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式之《组合模式》

介绍 组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。[DP]属于结构型模式之一。 Component抽象构件角色 定义参加组合对象的共有方法和属性, 可以定义一些默认的行为或属性。 Leaf叶子构件 叶子对象, 其下再也没有其他的分支, 也就是遍历的最小单位。 Composite树枝构件 树枝对象, 它的作用是组合树枝节点和叶子节点形成一个树形结构 透明组合模式中,抽象构件Component中声明了所有

刘一儿(嵌入式) 524

DP-详解组合模式代码实现

详解组合模式代码实现

工匠精神coding,终生学习 257

设计模式的生动解释

I、创建型模式1、ABSTRACT FACTORY球场作为一个抽象工厂,可以举办球赛(产品)。法兰克福球场作为一个具体工厂,生产 具体的产品(例如巴西对法国的比赛)。你可以直接说到球场看比赛,到底是什么比赛由具体球场产生,比如盖尔森基兴球场(另一个具体工厂)就产生了英格兰对 葡萄牙的比赛。当某个具体工厂的产品发生改变的时候(比如柏林球场原来生产德国对阿根廷的比赛,后来生产XX对YY的决赛),对其他

923

设计模式(十一)-组合模式(Composite Pattern)——容器与内容的一致性

组合模式(Composite Pattern)是能够使容器与内容具有一致性,创造出递归结构的模式。 Entry.java package com.test.dp.Composite.Sample; //抽象类,表示“目录条目”,用来实现File和Directory的一致性 public abstract class Entry { public abstract String g

u014378181的博客 335

(轉貼) Design Pattern週期表 (OO) (Design Pattern)

轉貼自http://home.earthlink.net/~huston2/dp/patterns.html  GoF Design Patterns amazon.com download GoF source Table of Intents Table of Mnemonics (1 column) Table of Mnemonics (3 column) U...

weixin_33728708的博客 179

软件设计师真题精讲:从RISC/CISC到Python通信,打通知识脉络

计算机体系结构中的RISC与CISC是理解现代CPU架构的基础,RISC指令精简、追求能效,CISC指令复杂、功能强大,这一原理直接关联到ARM与x86在移动和服务器领域的竞争。在软件工程实践中,理解不同编程语言的特性和交互方式至关重要,例如Python与C的通信机制,涉及C扩展、子进程调用等多种技术,用于平衡开发效率与执行性能。这些核心概念与原理,共同支撑着软件设计师在系统分析、数据库设计、算法实现等场景中解决复杂问题的能力。本文以软件设计师真题为载体,深入剖析RISC/CISC对比、Python与C通信

weixin_34068198的博客 451

C++多态机制深度解析:从虚函数表到内存布局与性能优化

多态是面向对象编程的核心概念之一,它允许通过统一的接口调用不同派生类的具体实现,从而实现代码的高度可扩展性和可维护性。其底层原理主要依赖于虚函数表(vtable)和虚函数表指针(vptr)机制,编译器在运行时通过动态绑定确定实际调用的函数地址。这一机制在软件设计中具有重要价值,是实现设计模式如工厂模式、策略模式的基础,广泛应用于图形渲染、插件系统、游戏引擎等场景。本文聚焦C++多态的实现细节,深入探讨虚函数表的内存布局、虚析构函数的必要性、以及多重继承下的vptr管理,并结合性能考量,分析如何通过final

weixin_34006468的博客 457

[DP]Builder设计模式

Builder设计模式

HeapStackk的博客 1279

[DP]简单工厂,工厂方法和抽象工厂方法

简单工厂,工厂方法和抽象工厂方法

HeapStackk的博客 886
上一篇: [DP]Bridge设计模式
下一篇: [DP]Decorator设计模式
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值