首页 > 其他 > 详细

设计模式之组合模式

时间:2014-03-01 16:39:42      阅读:455      评论:0      收藏:0      [点我收藏+]

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

#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;
}

总结

      本篇博文主要是分析了设计模式中的组合模式,这种模式最大的特点就是组合对象和叶子对象具有相同的行为操作,并且这种设计模式在一些组合对象应用中使用比较的多,好好地体会吧,好了,本篇博文到此结束,下篇博文我们继续学习设计模式之代理模式。

如果需要,请注明转载,多谢
 

设计模式之组合模式,布布扣,bubuko.com

设计模式之组合模式

原文:http://blog.csdn.net/zmyer/article/details/20156295

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!