[设计模式]组合模式(Compostie)

工业互联网工控安全与工业质检AI大模型建设方案.pptx 立即下载

1.意图

       将对象组合成树状结构以表示“部分—整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性(整体和部分一致对待)。

2.动机

       在图形应用系统中可以用简单的组件(图元)创建复杂的组件(图表)。用户可以组合多个组件形成一个较大的组件(Winform开发中就有自定义控件),这些组件又可以组合成更大的组件。一个实现方法就是对组件定义一些类,另外定义一些类作为这些组件的容器类。

       然而这带来一个问题:使用这些类的代码必须区别对待组件类和容器类,而实际上大多数情况下用户认为他们是一样的。对这些类的区别使用会使得程序更加复杂。组合模式描述了如何使用递归组合,使得用户不必对这些类进行区别。

3.结构与参与者


4.效果

1)定义了包含基本对象和组合对象的类层次结构

     基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。

2)简化客户代码

     客户可以一致地使用组合结构和单个对象(就好比用自定义控件就不需要每次都从轮子造起了)。

3)使得更容易增加新类型的组件

      新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需要因加入新的组件而改变。

4)使设计变得更加一般化(缺)

      容易增加新组建也会产生一些问题,那就是很难限制组合中的组件。有时你希望一个组合只能有某些特定组件。使用组合模式是,你不能依赖系统类型施加这些约束,而必须在运行时刻进行检查。

5.实现

6.代码示例

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Company
{
protected:
	string m_strName;
public:
	Company(string strName)
	{
		m_strName = strName;
	}

	virtual void Add(Company* c)=0;
	virtual void Display(int nDepth)=0;
	virtual void LineOfDuty()=0;
	virtual ~Company(){}
};

class ConcreteCompany: public Company
{
private:
	vector<Company*> m_company;
public:
	ConcreteCompany(string strName):Company(strName){}

	virtual void Add(Company* c)
	{
		m_company.push_back(c);
	}
	virtual void Display(int nDepth)
	{
		string strtemp;
		for(int i=0; i < nDepth; i++)
		{
			strtemp += "-";
		}
		strtemp +=m_strName;
		cout<<strtemp<<endl;

		vector<Company*>::iterator p=m_company.begin();
		while (p!=m_company.end())
		{
			(*p)->Display(nDepth+2);
			p++;
		}
	}
	virtual void LineOfDuty()
	{
		vector<Company*>::iterator p=m_company.begin();
		while (p!=m_company.end())
		{
			(*p)->LineOfDuty();
			p++;
		}
	}
};

class HrDepartment : public Company
{
public:

	HrDepartment(string strname) : Company(strname){}

	virtual void Display(int nDepth)
	{
		string strtemp;
		for(int i = 0; i < nDepth; i++)
		{
			strtemp += "-";
		}

		strtemp += m_strName;
		cout<<strtemp<<endl;
	}
	virtual void Add(Company* c)
	{
		cout<<"error"<<endl;
	}

	virtual void LineOfDuty()
	{
		cout<<m_strName<<":招生"<<endl;
	}
};
//客户端:
int main()
{
	ConcreteCompany *p = new ConcreteCompany("东南大学");
	p->Add(new HrDepartment("东南大学招生办"));
	
	ConcreteCompany *p1 = new ConcreteCompany("数学系");
	p1->Add(new HrDepartment("数学系招生办"));
	
	ConcreteCompany *p2 = new ConcreteCompany("物理系");
	p2->Add(new HrDepartment("物理系招生办"));
	
	p->Add(p1);
	p->Add(p2);
	cout << "组织结构:"<<endl;
	p->Display(1);
	cout << "各部门职责:"<<endl;
	p->LineOfDuty();
	return 0;
}


2024 《计算机网络》实验教学指导书.doc 立即下载

相关推荐

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 880

设计模式之组合模式

设计模式之组合模式使用组合模式的场景: 把部分和整体的关系用树状结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象核心: 抽象构件角色:定义了叶子和容器构件的共同点 叶子结点:无子节点 容器构件角色:有容器的特性,可以包含子节点, 组合模式怎么用我们一病毒查杀为例,练习一下组合模式 public interface File { void kill();// 杀病毒 } //

zhaojianyin 699

用Omniverse Kit开发第一个USD插件:从环境配置到实战案例(Python 3.7版)

本文详细介绍了如何使用NVIDIA Omniverse Kit和Python 3.7开发第一个USD插件,涵盖从环境配置到实战案例的全过程。通过创建可实时同步材质属性的USD插件,开发者可以快速掌握Omniverse开发框架,提升3D内容创作效率。

x8y9z0的博客 585

[设计模式]装饰器模式(Decorator)

当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。其根本的思想和Python中的装饰器是一样的。(装饰器模型的别名就是包装器Wrap

sicofield的专栏 1531

BIM模型导入SuperMap

目录 一、超图 BIM插件安装 1.1 插件下载 1.2 安装 二、BIM模型导出 2.1 Revit插件导出 2.2 SuperMap导入工具 三、SuperMap BIM数据处理与服务发布 四、SuperMap三维数据处理中关于模型高程修改方法 一、超图 BIM插件安装 1.1 插件下载 下载链接:http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?tt=ProductAAS&id=134 1..

爱晒太阳的风 3596

【Simulink教程案例18】基于simulink的基础OFDM+64QAM发射接收链路仿真

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的。

FPGA/MATLAB学习教程/源码/项目合作开发 1984

[设计模式]状态模式 (State)

1.意图        允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 2.结构与参与者 3.适用性        1)一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。        2)一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态。这个状态通常用一个或者多个枚举常量表示。通常,有多个操作包含这一相

sicofield的专栏 1243

【ComfyUI 基础教程】ComfyUI 局部重绘工作流教程

本篇指南将带你了解 ComfyUI 中的局部重绘工作流,并带你完成一个局部重绘的示例,以及遮罩编辑器的使用等。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 301

[设计模式]模板方法模式(Template Method)

1.意图        定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.动机        其实就是如意图所描述的,算法的骨架是一样的,就是有些特殊步骤不一样。就可以采用模板方法,将相同的功能上升到父类中去。其实说白了就有点C++的继承就是一个模板方法。 3.结构与参与者

sicofield的专栏 1234

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3583

基于深度学习YOLOv11的布匹缺陷检测系统(Python+PySide6界面+训练代码)

YOLOv11模型训练:根据布匹缺陷数据集训练YOLOv11模型,以识别布匹中的各种缺陷,如裂纹、污渍、破损等。PySide6界面设计:设计一个图形用户界面,帮助用户上传布匹图像,并显示模型的检测结果。模型优化与精度提升:通过数据增强、超参数调优等手段提高模型的准确性。本文介绍了如何基于YOLOv11实现布匹缺陷检测系统,并通过PySide6构建了一个图形用户界面。该系统能够自动检测布匹中的各种缺陷,具有较高的效率和精度。

斌擎科技 529

[设计模式]观察者模式(Observer)

1.意图        定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 2.动机        将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使得各类紧密耦合,因为这样降低了它们的可重用性。        举个例子,一个表格对象和一个柱状图对象还有一个饼图对象,可以描述同

sicofield的专栏 1196

移位寄存器——用Verilog实现串入串出、串并和并串转换并进行Modelsim仿真

用Verilog实现串并转换 首先我们先要了并串和串并转换的原理 并串转换:先将八位数据暂存于一个八位寄存器器中,然后左移输出到一位输出端口,这里可以通过一个“移位”来实现,相当于实现了移位寄存器的功能。 串并转换:新输入的位值成为原来数据的最低位,将原来数据的最高位舍去,这里可以通过一个简单的“连接符”来实现。 我们这里采用两种方式来进行串并转换 一:lsb优先 Least Significant Bit,最低比特,最低位优先 二:msb优先 Most Significant Bit,最高比特,

H19981118的博客 2万+

[设计模式]责任链模式(Chain of Resposibilty)

1.意图        使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 2.动机        好比《大话设计模式上》的请求加薪,需要层层上交批准。这样的话请求者和响应请求者之间强耦合会生成很多判断语句。这里的目的就是要将提交请求的对象和可能提供解决措施的对象解耦。并且这样的方式可以随时修改处理

sicofield的专栏 1130

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[设计模式]代理模式(Proxy)

1.意图        为其他对象提供一种代理以控制对这个对象的访问。 2.结构与参与者 3.动机        对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的开箱很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。因为并非所有这些对

sicofield的专栏 1117

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[设计模式]桥接模式(Bridge)

1.意图        将抽象部分与它的实现部分分离,使它们都可以独立地变化。 这里说的意思不是让抽象基类与具体类分离,而是现实系统可能有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出来让它们独立变化,减少它们之间的耦合性,即如果继承不能实现“开放-封闭原则”的话,就应该考虑用桥接模式。如:让“手机”既可以按品牌分类也可以按软件类型分类。 2.动机        当一个抽象可能

sicofield的专栏 1112

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[设计模式]享元模式(Flyweight)

1.意图        运用共享技术有效地支持大量细粒度的对象。 2.动机        有些应用程序在其整个设计过程中采用对象技术,但简单化的实现代价极大。        例如,Python等程序中字符串是一个对象。如下面的程序所示,a和b共享了同一个字符串。 >>> a="Hello World" >>> b="Hello World" >>> id(a) 14407008 >>>

sicofield的专栏 1062

[设计模式]建造者模式(Builder)

1.      意图        将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。并且因为构建过程是标准化的,所以当需要标准化构建过程时也可以使用。 2.      结构与参与者 3.      效果 1) 它使你可以改变一个产品的内部表示        Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表

sicofield的专栏 959

[设计模式]单例模式(Singleton)

1.  意图        保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 结构与参与者 3.效果 1)对唯一实例的受控访问        因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。 2)缩小名称空间        Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名称空间。

sicofield的专栏 891

[设计模式]备忘录模式(Memento)

1.意图        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。 2.动机        有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其不封或所有的状态信息,使

sicofield的专栏 854

[设计模式]抽象工厂模式(AbstructFactory)

1.意图        定义了一个创建一系列相关或相互依赖的接口,而无需指定它们的具体类。 2.结构与参与者 3.效果 1) 分离了具体的类(优)        因为工厂封装了创建产品对象的责任和过程(只是用一个return语句返回具体对象),这将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分析;它们不出现在客户代码中。 2)易于

sicofield的专栏 846

[设计模式]工厂方法模式(Factory Method)

与抽象工厂的区别:抽象工厂的抽象类组合的是创建一个系列对象的接口。而工厂方法只有一个接口,各个具体类实现该接口的方式不一样。 1. 意图        定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 2. 结构与参与者 3.效果        1)为子类提供挂钩(hook) 还没有搞懂        2

sicofield的专栏 845

[设计模式]适配器模式(Adapter)

1.意图        将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 2.结构与参与者 3.代码示例 #include #include using namespace std; class Player { protected: string name; public: Player(str

sicofield的专栏 810
上一篇: [设计模式]备忘录模式(Memento)
下一篇: [设计模式]桥接模式(Bridge)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值