在上篇博文中,我们学习了设计模式中的外观模式,这种模式主要是通过对外提供一个易用的接口,从而使得用户不必关系接口内部的实现,这种设计模式在一些构件开发中,使用很广泛,今天我们就来学习一下另外一个设计模式——组合模式,首先来看看组合模式的定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。怎么来理解这句话,就好比一家跨国公司,在本土有总部,而在其他的地区又有分部,而总部包含分部,在总部里面有各式各样的部门,而在分部同样有这些部门,因此可以看出总部和分部之间是一种包含关系,而针对总部内部的各个部门同样具有包含关系,因此由这些包含关系组成的结构模式,我们一般称之为组合模式,好了,下面就来看看代码吧,代码如下:
#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