组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
比如:一个公司,它有一个总公司,下面还有许多子公司。每个公司都有自己的财务部、人力资源部等。对于总公司来说,不论是子公司,还是财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。
UML:
//抽象公司类
class Company {
protected:
string m_name;
public:
Company(string name):m_name(name){}
virtual ~Company(){}
virtual void Add(Company *company) {}
virtual void Diaplay(int depth) {}
};
//具体公司类
class ConcreteCompany :public Company {
private:
list<Company *> m_list;
public:
ConcreteCompany(string name):Company(name){}
virtual ~ConcreteCompany() {}
void Add(Company *company)
{
m_list.push_back(company);
}
void Diaplay(int depth)
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << m_name << endl;
for (auto l : m_list) //显示结点
l->Diaplay(depth + 2);
}
};
//人力资源部门
class HRDepartment :public Company
{
public:
HRDepartment(string name) :Company(name) {}
virtual ~HRDepartment() {}
void Diaplay(int depth) //叶节点,没有添加函数
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << m_name << endl;
}
};
//财务部门
class FinanceDepartment : public Company
{
public:
FinanceDepartment(string name) :Company(name) {}
virtual ~FinanceDepartment() {}
void Diaplay(int depth)
{
for (int i = 0; i < depth; i++)
cout << "-";
cout << m_name << endl;
}
};
int main()
{
Company *root = new ConcreteCompany("总公司");
Company *leaf1 = new FinanceDepartment("财务部");
Company *leaf2 = new HRDepartment("人力资源部");
root->Add(leaf1);
root->Add(leaf2);
Company *mid1 = new ConcreteCompany("分公司A");
Company *leaf3 = new FinanceDepartment("A财务部");
Company *leaf4 = new HRDepartment("A人力资源部");
mid1->Add(leaf3);
mid1->Add(leaf4);
root->Add(mid1);
Company *mid2 = new ConcreteCompany("分公司B");
FinanceDepartment *leaf5 = new FinanceDepartment("B财务部");
HRDepartment *leaf6 = new HRDepartment("B人力资源部");
mid2->Add(leaf5);
mid2->Add(leaf6);
root->Add(mid2);
root->Diaplay(1);
system("pause");
return 0;
}