设计模式笔记-Composite模式

组合模式,UML图和装饰模式非常像,但二者代表的意义是不同的. 装饰主要用来在已有的类中添加功能; 组合模式主要是:在开发中会遇到一些树形组织结构的现实对象,比如:电脑主板,包括:CPU,芯片组,I/O设备等;其中的芯片组包括:声卡芯片,显卡芯片;I/O设备包括:USB I/O,  VGA I/O等。这里的cpu, 声卡芯片等可以看作是叶节点。芯片组、I/O设备可看作是组合元件。再比如,一个大公司,下面有财务部门、HR部门,也有很多分公司,各级公司也都有财务部门、HR部门等。

所以,在组合模式中,组合类也是一个具体实际存在的类,它里面组合了同一层次的其它节点!而在装饰模式中,Decorate类是为了完成需求额外添加的!

组合使得用户对单个对象和组合对象的使用具有一致性!也就是他们有一些相同的接口,如下图中的Show(),组合类(ConcreteCompany)有从基类继承的操作接口:Add(), Remove()等,这些接口财务、HR类是不需要实现的!另外就是组合类中一般都会有包含其它节点指针的容器成员变量:vector,list, hashmap等。当然也需要提供一个索引节点的成员函数,getIndex(xx)!下图中没显示。组合类中Show()函数里面一般会有一个循环,在其中逐个调用其它节点的Show()函数!


给个示例代码吧!

class Company  
{
public:
	virtual ~Company(){}
	virtual void Add(Company *pCom){}
	virtual void Operation() {}
};
//具体公司
class ConcreteCompany : public Company  
{
public:
	ConcreteCompany() {}
	virtual ~ConcreteCompany() {}
	void Add(Company *pCom) { m_listCompany.push_back(pCom); }
	void Show()
	{
		list<Company *>::iterator iter=m_listCompany.begin();
		for(; iter != m_listCompany.end(); iter++)
			(*iter)->Operation();
	}
private:
	list<Company *> m_listCompany;
};
//具体的部门,财务部
class FinanceDepartment : public Company 
{
public:
	FinanceDepartment(){}
	virtual ~FinanceDepartment() {}
	virtual void Operation() //只需显示,无限添加函数,因为已是叶结点
	{
		cout<<"In FinaceDepartment"<<endl;
	}
};
//具体的部门,人力资源部
class HRDepartment :public Company  
{
public:
	HRDepartment(){}
	virtual ~HRDepartment() {}
	virtual void Operation() //只需显示,无限添加函数,因为已是叶结点
	{
		cout<<"In HRDepartment"<<endl;
	}
};
int main()
{
	Company *root = new ConcreteCompany();
	Company *leaf1=new FinanceDepartment();
	Company *leaf2=new HRDepartment();
	root->Add(leaf1);
	root->Add(leaf2);
        root->Operation();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值