C++ 11 装饰器模式

  1. 说明

    • 装饰器模式

      • decorator pattern.
      • 动态的添加和删除,抛开设计模式,能够动态添加和删除的数据结构就是链表。链表分叉,形成树,图。

    • 好处

      • 动态的给对象添加一个功能。
      • 形式也是以链表的形似和。
      • 扩展一个功能将不需要继承或者是组合。
    • 坏处

      • 坏处复杂。
      • 类爆炸。
    • 对比

      • 集合存储方式差异。
      • 构造者定长数组,装饰器变长链表。
      • 要是有层次模式,还可以用组合模式来进行管理。
  2. 案例

    • 书接上回

      • 鞋贩子出席漫展,去cosplay
      • 自己给自己加服饰造型,服饰即装饰的东西。
    • 代码

      #include <iostream>
      #include <vector>
      #include <string>
      
      class Decorator {
      public:
       virtual std::string show() = 0;
      };
      
      class MaoZi : public Decorator {
      public:
       MaoZi(Decorator* dec):dec_(dec){}
       std::string show() {
         std::string temp = "maozi";
         if(dec_) {
           temp += "shang you yi ge " + dec_->show();
         }
         return temp;
       }
      private:
       Decorator* dec_;
      };
      
      class PiDai : public Decorator {
      public:
       PiDai(Decorator* dec):dec_(dec){}
       std::string show() {
         std::string temp = "pidai";
         if(dec_) {
           temp += "shang you yi ge " + dec_->show();
         }
         return temp;
       }
      private:
       Decorator* dec_;
      };
      
      class XieZi : public Decorator {
      public:
       XieZi(Decorator* dec):dec_(dec){}
       std::string show() {
         std::string temp = "xiezi";
         if(dec_) {
           temp += "shang you yi ge " + dec_->show();
         }
         return temp;
       }
      private:
       Decorator* dec_;
      };
      
      
      class TieHua : public Decorator {
      public:
       TieHua(){}
       std::string show() {
         return "tiehua";
       }
      };
      
      class PiKaQiu : public Decorator {
      public:
       PiKaQiu(){}
       std::string show() {
         return "pi ka qiu";
       }
      };
      
      class XieFanZi {
      public:
       XieFanZi(Decorator* zhuangshi = nullptr):maozi(new MaoZi(zhuangshi)),
                                                xiezi(new XieZi(zhuangshi)),
                                                pidai(new PiDai(zhuangshi)){}
       void show() {
         std::cout << maozi->show() << std::endl;
         std::cout << xiezi->show() << std::endl;
         std::cout << pidai->show() << std::endl;
       }
      private:
       Decorator* maozi;
       Decorator* xiezi;
       Decorator* pidai;
      };
      
      int main() {
       {
         XieFanZi cosplay(new TieHua());
         cosplay.show();
       }
       {
         XieFanZi cosplay(new PiKaQiu());
         cosplay.show();
       }
      }
      
    • 说明

      • 鞋贩子给的鞋子帽子皮带都贴了一张贴画。
      • 然后还有一套都贴了皮卡丘。
  3. 总结

    • 核心

      • 动态增删.
      • 链表,有一个next指针(Decorator对象).
### C++装饰器设计模式的实现与用法 #### 装饰器模式的核心概念 装饰器模式是一种结构型设计模式,用于在不改变对象原有接口的前提下为其动态添加功能。这种方式可以替代传统的继承机制,减少子类的数量并提高系统的灵活性[^1]。 #### 基本组成要素 装饰器模式通常由以下几个部分构成: - **抽象组件(Component)**:定义了被装饰的对象以及装饰器共同遵循的接口。 - **具体组件(Concrete Component)**:实现了抽象组件中的方法,表示实际要被装饰的具体对象。 - **装饰器抽象类(Decorator)**:持有一个指向抽象组件类型的成员变量,并声明了一个构造函数用来注入这个成员变量。它还提供了与抽象组件相同的方法签名以便于后续扩展。 - **具体装饰器(Concrete Decorator)**:负责向组件添加新的责任或修改其行为[^2]。 #### 示例代码展示 下面是一个简单的例子来说明如何利用C++实现装饰器模式: ```cpp #include <iostream> #include <memory> // 抽象组件 (Component) class Coffee { public: virtual ~Coffee() {} virtual double cost() const = 0; }; // 具体组件 (Concrete Component): 简单咖啡 class SimpleCoffee : public Coffee { public: double cost() const override { return 1.0; } }; // 抽象装饰器 (Decorator) class CoffeeDecorator : public Coffee { protected: std::shared_ptr<Coffee> decorated_coffee; public: explicit CoffeeDecorator(std::shared_ptr<Coffee> coffee) : decorated_coffee(coffee) {} double cost() const override { return decorated_coffee->cost(); } // 默认调用原生成本计算逻辑 }; // 具体装饰器A (Concrete Decorator A): 加牛奶 class MilkCoffee : public CoffeeDecorator { public: using CoffeeDecorator::CoffeeDecorator; double cost() const override { return decorated_coffee->cost() + 0.5; // 添加牛奶的成本 } }; // 具体装饰器B (Concrete Decorator B): 加糖 class SugarCoffee : public CoffeeDecorator { public: using CoffeeDecorator::CoffeeDecorator; double cost() const override { return decorated_coffee->cost() + 0.3; // 添加糖的成本 } }; int main() { auto simple_coffee = std::make_shared<SimpleCoffee>(); std::cout << "Cost of simple coffee: $" << simple_coffee->cost() << "\n"; auto milk_coffee = std::make_shared<MilkCoffee>(simple_coffee); std::cout << "Cost of milk coffee: $" << milk_coffee->cost() << "\n"; auto sugar_milk_coffee = std::make_shared<SugarCoffee>(milk_coffee); std::cout << "Cost of sugar and milk coffee: $" << sugar_milk_coffee->cost() << "\n"; } ``` 上述程序展示了如何通过组合不同的装饰器来构建复杂的对象,同时保持原有的简单性和可维护性[^4]。 #### 使用场景分析 当需要为某些特定的功能增加额外的能力而又不想更改这些功能的基础代码时,就可以考虑采用装饰器模式。比如,在图形界面开发中,可能希望给窗口加上滚动条或者边框等功能;又或者是网络通信领域里为了支持压缩传输数据而在消息发送前加入压缩处理等等情况都适合运用此模式[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值