组合模式,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();
}