设计模式-组合模式

设计模式-组合模式,第1张

1.组合模式:

    特点:

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


例如,部门-子部门模型,就适合使用

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


    种类:

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


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


    缺点:

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


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


2, 示范代码

/*
组合模式:
    特点:
        多个对象形成树形结构以表示“整体-部分”的结构层次,并且对待单个对象和整体对象的处理方式是一致的.该模式适用于具有层次的,部分-整体结构模型。


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


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


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


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


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


*/ #include #include #include #include #include class myCompose { protected: /* data */ 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: /* data */ 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 首都 首都行政中心 首都人力中心 省份 省份人力资源部 省份财务部

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/562357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存