装饰模式

动态地给一个对象添加一些额外的职责,就添加功能来说,装饰模式比生成子类更加灵活:
image.png

  • Component 是定义一个对象接口,可以给这些对象动态地添加职责。
  • ConcreteComponent 定义了一个具体的对象,也可以给这个对象添加一些职责。
  • Decorator 装饰抽象类,继承自 Component,从外类来扩展 Component 类的功能,但对于 Component 类来说不需要知道 Decorator 的存在
  • ConcreteDecorator 是具体的装饰对象类。 ```cpp

    include

    include

class Component { public: virtual void Operation() = 0;

  1. virtual ~Component() = default;

};

class ConcreteComponent final : public Component { public: ConcreteComponent() = default;

  1. void Operation() override {
  2. std::cout << "concrete object operation!\n";
  3. }

};

class Decorator : public Component { public: explicit Decorator(std::uniqueptr&& component) : component(std::move(component)) {}

  1. void Operation() override {
  2. if (component_) {
  3. component_->Operation();
  4. }
  5. }
  6. virtual ~Decorator() = default;

private: std::uniqueptr component; };

class ConcreteDecoratorA final : public Decorator { public: explicit ConcreteDecoratorA(std::unique_ptr&& component) : Decorator(std::move(component)) {}

  1. void Operation() override {
  2. Decorator::Operation();
  3. addedState = "New State";
  4. std::cout << "concrete decorator A operation\n";
  5. }

private: std::string addedState; };

class ConcreteDecoratorB final : public Decorator { public: explicit ConcreteDecoratorB(std::unique_ptr&& component) : Decorator(std::move(component)) {}

  1. void Operation() override {
  2. Decorator::Operation();
  3. AddedBehavior();
  4. }

private: void AddedBehavior() { std::cout << “B AddedBehavior\n”; } };

auto main(void) -> int { std::unique_ptr c = std::make_unique(); std::unique_ptr d1 = std::make_unique(std::move(c)); std::unique_ptr d2 = std::make_unique(std::move(c));

  1. d1->Operation();
  2. d2->Operation();
  3. return 0;

} `` 如果需要对 Decorator 持有的待装饰对象进行装饰(更改),可以在 Decorator 类中增加getComponent()setComponent()`成员函数。

当然,如果只有一个 ConcreteComponent 类,没有抽象的 Component 类,那么 Decorator 类可以是 ConcreteComponent 的一个子类。