C++ 10 组合模式

  1. 说明

    • 组合模式

      • Composite pattern

      • 即将若干基础组成一个整体,也就是树,不过节点比较多,就是2-3-4树,多叉树,B+树.
      • 突出的就是整体由若干组成。
    • 对比建造者

      • 建造者着重于创建对象。
      • 着重于组合,逻辑结构。两者不冲突。
      • 组合模式注重的是逻辑结构,树型结构。建造注重的是结果。

    • 补充

      • 可以是上下级的组织结构。
      • 也可以是平级的组织结构。
    • 常用

      • 公司的层次结构,上下级关系。
      • 语法树。
      • UI中的窗口控件树。
  2. 案例

    • 书接上回

      • 鞋贩子规模大了,想要简便的方式查看员工情况。
    • 代码

      #include <vector>
      #include <iostream>
      #include <string>
      
      
      class TuanDui {
      public:
       virtual void addChengYuan(TuanDui* chengyuan) = 0;
       virtual void ChaKan() = 0;
      };
      
      class BuMen : public TuanDui{
      public:
       BuMen(std::string leader):lead_(leader){}
       void addChengYuan(TuanDui* chengyuan) {
         chengyuan_.emplace_back(chengyuan);
       }
       void ChaKan() {
         std::cout << "----------------" << lead_ << "-----------------" << std::endl;
         for(auto i:chengyuan_) {
           i->ChaKan();
         }
       }
      private:
       std::string lead_;
       std::vector<TuanDui*> chengyuan_;
      };
      
      class PuTongYuanGong : public TuanDui{
      public:
       PuTongYuanGong(std::string name):name_(name){}
       void addChengYuan(TuanDui* chengyuan) {
         std::abort();
       }
       void ChaKan() {
         std::cout << name_<< std::endl;
       }
      private:
       std::string name_;
      };
      
      
      
      
      
      int main() {
       TuanDui* dong_shi_zhang = new BuMen("xie fan zi");
       {
         TuanDui* chu_na_bu = new BuMen("zhangsan");
         TuanDui* zhi_gong_1 = new PuTongYuanGong("xiaoli");
         TuanDui* zhi_gong_2 = new PuTongYuanGong("xiaoliu");
         TuanDui* zhi_gong_3 = new PuTongYuanGong("xiaowu");
         TuanDui* zhi_gong_4 = new PuTongYuanGong("xiaoqi");
      
         chu_na_bu->addChengYuan(zhi_gong_1);
         chu_na_bu->addChengYuan(zhi_gong_2);
         chu_na_bu->addChengYuan(zhi_gong_3);
         chu_na_bu->addChengYuan(zhi_gong_4);
      
         dong_shi_zhang->addChengYuan(chu_na_bu);
       }
      
       {
         TuanDui* dao_gou_bu = new BuMen("zhangsi");
         TuanDui* zhi_gong_1 = new PuTongYuanGong("sixiaoli");
         TuanDui* zhi_gong_2 = new PuTongYuanGong("sixiaoliu");
         TuanDui* zhi_gong_3 = new PuTongYuanGong("sixiaowu");
         TuanDui* zhi_gong_4 = new PuTongYuanGong("sixiaoqi");
      
         dao_gou_bu->addChengYuan(zhi_gong_1);
         dao_gou_bu->addChengYuan(zhi_gong_2);
         dao_gou_bu->addChengYuan(zhi_gong_3);
         dao_gou_bu->addChengYuan(zhi_gong_4);
      
         dong_shi_zhang->addChengYuan(dao_gou_bu);
       }
       dong_shi_zhang->ChaKan();
      }
      
    • 说明

      • 鞋贩子领导下的收纳和导购两个部门情况。
      • 鞋贩子直属下属,直属下属若干员工。
  3. 总结

    • 差异

      • 组合是结构

      • 建造是结果

    • 补充

      • 建造和组合不冲突,可以共存。
      • 比如组合的最基本成员需要构造模式的方式来创建。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值