组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使
用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。
组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之
地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每
个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来
组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。
下面是组合模式的结构图:
(1)Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口
用于访问和管理Component子部件。
(2)Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
(3)Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加
(add)和删除(remove)等。
下面是用组合模式编写的代码:
运行后:
#include <iostream>
#include <list>
using namespace std ;
class Company //公司抽象类
{
string strName ;
public:
Company(string name):strName(name){} //构造函数 传入公司(部门)名字
string Getname() //获取名字
{
return strName ;
}
virtual void Add(Company * p) = 0 ; //增加公司(部门)名字
virtual void Remove(Company * p) = 0 ; //删除公司(部门)名字
virtual void Display() = 0 ; //打印公司(部门)名字
virtual void Duty() = 0 ; //打印部门职责
};
class RealCompany : public Company //具体的公司类
{
list<Company*> mylist ; //存放公司的链表
list<Company*> ::iterator it ; //迭代器
public:
RealCompany(string name):Company(name){} //构造函数传入公司名字
void Add(Company * p) //实现增加公司(部门)名字
{
mylist.push_back(p) ;
}
void Remove(Company * p) //实现删除公司(部门)名字
{
mylist.remove(p) ;
}
void Display() //打印公司(部门)名字
{
cout<<"——"<<this->Getname()<<endl ;
for(it = mylist.begin();it != mylist.end();it++)
{
//cout<<"——" ;
(*it)->Display() ;
}
}
void Duty() //打印部门职责
{
for(it = mylist.begin();it != mylist.end();it++)
{
(*it)->Duty() ;
}
}
};
class HRDepartment : public Company //人力资源部门
{
public:
HRDepartment(string name):Company(name){}
void Add(Company * p)
{
return;
}
void Remove(Company * p)
{
return;
}
void Display() //打印部门名字
{
cout<<this->Getname()<<endl;
}
void Duty() //打印部门职责
{
cout<<this->Getname()<<"员工招聘培训管理"<<endl;
}
};
class FinDepartment : public Company //财务部门
{
public:
FinDepartment(string name):Company(name){}
void Add(Company * p)
{
return;
}
void Remove(Company * p)
{
return;
}
void Display() //打印部门名字
{
cout<<this->Getname()<<endl;
}
void Duty() //打印部门职责
{
cout<<this->Getname()<<"公司财政管理"<<endl;
}
};
int main()
{
RealCompany * pBeijing = new RealCompany("北京总公司") ;
pBeijing->Add(new HRDepartment("总公司人力资源部")) ;
pBeijing->Add(new FinDepartment("总公司财政部门")) ;
RealCompany * pShanghai = new RealCompany("上海分公司") ;
pShanghai->Add(new HRDepartment("华东分公司人力资源部")) ;
pShanghai->Add(new FinDepartment("华东分公司财政部门")) ;
pBeijing->Add(pShanghai) ;
RealCompany * pNanjing = new RealCompany("南京办事处") ;
pNanjing->Add(new HRDepartment("办事处人力资源部")) ;
pNanjing->Add(new FinDepartment("办事处财政部门")) ;
pBeijing->Add(pNanjing) ;
cout<<"结构图:"<<endl ;
pBeijing->Display() ;
cout<<"\n职责:"<<endl;
pBeijing->Duty();
pBeijing->Remove(pNanjing);
cout<<"\n结构图:"<<endl;
pBeijing->Display();
cout<<"\n职责:"<<endl;
pBeijing->Duty();
}
运行后: