栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

设计模式-组合模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式-组合模式

1.组合模式:

    特点:

        多个对象形成树形结构以表示“整体-部分”的结构层次,并且对待单个对象和整体对象的处理方式是一致的.该模式适用于具有层次的,部分-整体结构模型。例如,部门-子部门模型,就适合使用

        该模型处理,另外可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易。

    种类:

        1)安全组合模式:将管理子元素的方法定义在Composite类中。

        2)透明组合模式:将管理子元素的方法定义在Component接口中,这样Leaf类就需要对这些方法空实现。

    缺点:

        1)使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。

        2)增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制。

2, 示范代码


#include 
#include 
#include 
#include 
#include 

class myCompose
{
    protected:
        
        std::string comName_;
    public:
        myCompose(std::string name){
            comName_ = name;
        }
        ~myCompose(){}
        virtual void Add(myCompose* p)=0;
        virtual void Remove(myCompose* p)=0;
        virtual void Display()=0;
};

// 叶子节点
class leaf:public myCompose
{
    private:
        
    public:
        leaf(std::string name):myCompose(name)
        {
        }

        void Add(myCompose * p)
        {
           
        }
        void Remove(myCompose * p)
        {
           
        }
        void Display()
        {
          
        }

        ~leaf()
        {

        }
};

// 非叶子节点
class myComposeSon:public myCompose
{
    private:
        std::vector> vecCome_; // 存储组合的子对象
    public:
        myComposeSon(std::string name):myCompose(name){}
        ~myComposeSon()
        {
            if(!vecCome_.empty())
            {
                vecCome_.clear();
            }
        }

        void Add(myCompose*p)
        {
            auto it = find_if(vecCome_.begin(),vecCome_.end(),[p](std::shared_ptr ptr){return p == ptr.get();});
            if(it == vecCome_.end())
                vecCome_.push_back(std::shared_ptr(p));
            
        }

        void Remove(myCompose*p)
        {
            auto it = find_if(vecCome_.begin(),vecCome_.end(),[p](std::shared_ptr ptr){return p == ptr.get();});
            if(it == vecCome_.end())
                return;
            vecCome_.erase(it);
        }

        void Display()
        {
            std::cout<Display();
            }       
        }

};

int main()
{
    myCompose* p = new myComposeSon("首都");
    p->Add(new leaf("首都行政中心"));
    p->Add(new leaf("首都人力中心"));

    myCompose* p1 = new myComposeSon("省份");
    p1->Add(new leaf("省份人力资源部"));
    p1->Add(new leaf("省份财务部"));

    // 组合成一个嵌套树形结构,但是部分跟整体的处理方式是一致的
    p->Add(p1);
    p->Display();
    return 0;
}

结果:
[root@localhost c++]# ./a.out 
首都
首都行政中心
首都人力中心
省份
省份人力资源部
省份财务部

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779449.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号