在上篇博文中,我们学习了设计模式中的外观模式,这种模式主要是通过对外提供一个易用的接口,从而使得用户不必关系接口内部的实现,这种设计模式在一些构件开发中,使用很广泛,今天我们就来学习一下另外一个设计模式——组合模式,首先来看看组合模式的定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。怎么来理解这句话,就好比一家跨国公司,在本土有总部,而在其他的地区又有分部,而总部包含分部,在总部里面有各式各样的部门,而在分部同样有这些部门,因此可以看出总部和分部之间是一种包含关系,而针对总部内部的各个部门同样具有包含关系,因此由这些包含关系组成的结构模式,我们一般称之为组合模式,好了,下面就来看看代码吧,代码如下:
#ifndef __COMPONENT__H
#define __COMPONENT__H
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <list>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
class HeadQuarter
{
public:
HeadQuarter(string name=string()):name(name){}
~HeadQuarter(){}
virtual void MarketDepartmentInfo()
{
}
virtual void HumanResourceDepInfo()
{
}
virtual void addHeadQuarter(shared_ptr<HeadQuarter>& quarter)
{
}
virtual void delHeadQuater(shared_ptr<HeadQuarter>& quarter)
{
}
protected:
string name;
};
class MarketDepartment : public HeadQuarter
{
public:
MarketDepartment(string name=string()):HeadQuarter(name){}
~MarketDepartment(){}
void MarketDepartmentInfo()
{
printf("%s Market Department\n",name.c_str());
}
};
class HumanResourceDepartment : public HeadQuarter
{
public:
HumanResourceDepartment(string name= string()):HeadQuarter(name){}
~HumanResourceDepartment(){}
void HumanResourceDepInfo()
{
printf("%s Human Resource Department\n",name.c_str());
}
};
class BranchQuarterA : public HeadQuarter
{
public:
BranchQuarterA(string name=string()):HeadQuarter(name)
{
quarterlist.clear();
}
~BranchQuarterA(){}
void MarkerDepartmentInfo()
{
for(quarterlistIter iter = quarterlist.begin();iter!= quarterlist.end();++iter)
(*iter)->MarketDepartmentInfo();
}
void HumanResourceDepInfo()
{
for(quarterlistIter iter = quarterlist.begin();iter!=quarterlist.end();++iter)
(*iter)->HumanResourceDepInfo();
}
void addHeadQuarter(shared_ptr<HeadQuarter>& quarter)
{
quarterlist.push_back(quarter);
}
void delHeadQuater(shared_ptr<HeadQuarter>& quarter)
{
for(quarterlistIter iter = quarterlist.begin();iter != quarterlist.end();++iter)
{
if(*iter == quarter)
{
quarterlist.erase(iter);
break;
}
}
}
private:
std::list<shared_ptr<HeadQuarter> > quarterlist;
typedef std::list<shared_ptr<HeadQuarter> >::iterator quarterlistIter;
};
#endif
#include "Component.h"
int main()
{
shared_ptr<HeadQuarter> quarter1(new BranchQuarterA("HeadQuarter"));
shared_ptr<HeadQuarter> quarter2(new MarketDepartment("HeadMarkDepartment"));
shared_ptr<HeadQuarter> quarter3(new HumanResourceDepartment("HeadHumanResourceDepartment"));
quarter1->addHeadQuarter(quarter2);
quarter1->addHeadQuarter(quarter3);
shared_ptr<HeadQuarter> quarter4(new BranchQuarterA("BranchQuarter"));
shared_ptr<HeadQuarter> quarter5(new MarketDepartment("BranchQuarterMarketDepartment"));
shared_ptr<HeadQuarter> quarter6(new HumanResourceDepartment("BranchQuarterHumanResourceDepartment"));
quarter4->addHeadQuarter(quarter5);
quarter4->addHeadQuarter(quarter6);
quarter1->addHeadQuarter(quarter4);
quarter1->MarketDepartmentInfo();
quarter1->HumanResourceDepInfo();
return 0;
}
总结
本篇博文主要是分析了设计模式中的组合模式,这种模式最大的特点就是组合对象和叶子对象具有相同的行为操作,并且这种设计模式在一些组合对象应用中使用比较的多,好好地体会吧,好了,本篇博文到此结束,下篇博文我们继续学习设计模式之代理模式。
如果需要,请注明转载,多谢
原文:http://blog.csdn.net/zmyer/article/details/20156295