需求分析:很多“部分-整体”的关系,例如:大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。
组合模式:一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
优点:
缺点:
主要角色:
具体案例:
小码路所在的北京总公司,内部分为人力资源和财务部,在华东开了一家分公司,并分别在杭州和南京有办事处,总公司要求下码路实现全部架构。
第一步:抽象构件角色
#pragma once
#include <iostream>
using namespace std;
#include <list>
//抽象构件角色
class Company
{
public:
Company(string name)
{
this->name=name;
}
virtual void add(Company *company)=0;
virtual void display(int d)=0;
virtual void duty()=0;
public:
string name;
};
第二步:树叶构件角色
//具体构件角色
class ConCompany:public Company
{
private:
list<Company*> comList;
public:
ConCompany(string name):Company(name){}
void add(Company *company)override
{
comList.push_back(company);
}
void display(int d)override
{
//输出树型结构
for(int i=0;i<d;i++)
{
cout<<"-";
}
cout<<name<<endl;
//向下遍历
for (list<Company*>::iterator it = comList.begin();
it != comList.end(); ++it)
{
(*it)->display(d+1);
}
}
void duty()override
{
for (list<Company*>::iterator it = comList.begin();
it != comList.end(); ++it)
{
(*it)->duty();
}
}
};
第三步:树枝构件角色
//树枝构件角色
//人力资源部
class HRDepartment:public Company
{
public:
HRDepartment(string name):Company(name)
{
}
void add(Company *company)override
{
}
void display(int d)override
{
//输出树形结构的子节点
for(int i=0; i<d; i++)
{
cout<<"-";
}
cout<<name<<endl;
}
void duty()override
{
cout<<name << ":员工招聘培训管理"<<endl;
}
};
//财务部
class FinanceDepartment:public Company
{
public:
FinanceDepartment(string name):Company(name)
{
}
void add(Company *company)override
{
}
void display(int d)override
{
//输出树形结构的子节点
for(int i=0; i<d; i++)
{
cout<<"-";
}
cout<<name<<endl;
}
void duty()override
{
cout<<name << ":员工招聘培训管理"<<endl;
}
};
第四步:客户端
#include "c.h"
int main()
{
//总公司
Company *root = new ConCompany("北京总公司");
root->add(new HRDepartment("总公司人力资源部"));
root->add(new FinanceDepartment("总公司财务部"));
//分公司
Company *company = new ConCompany("上海华东分公司");
company->add(new HRDepartment("华东分公司人力资源部"));
company->add(new FinanceDepartment("华东分公司财务部"));
root->add(company);
//办事处
Company *company1 = new ConCompany("南京办事处");
company1->add(new HRDepartment("南京办事处人力资源部"));
company1->add(new FinanceDepartment("南京办事处财务部"));
company->add(company1);
Company *company2 = new ConCompany("杭州办事处");
company2->add(new HRDepartment("杭州办事处人力资源部"));
company2->add(new FinanceDepartment("杭州办事处财务部"));
company->add(company2);
cout<<"结构图:"<<endl;
root->display(1);
cout<<"职责:"<<endl;
root->duty();
}
结果显示: