装饰模式
动态地给一个对象添加一些额外的职责,就添加功能来说,装饰模式比生成子类更加灵活:
- Component 是定义一个对象接口,可以给这些对象动态地添加职责。
- ConcreteComponent 定义了一个具体的对象,也可以给这个对象添加一些职责。
- Decorator 装饰抽象类,继承自 Component,从外类来扩展 Component 类的功能,但对于 Component 类来说不需要知道 Decorator 的存在。
- ConcreteDecorator 是具体的装饰对象类。
```cpp
include
include
class Component { public: virtual void Operation() = 0;
virtual ~Component() = default;
};
class ConcreteComponent final : public Component { public: ConcreteComponent() = default;
void Operation() override {
std::cout << "concrete object operation!\n";
}
};
class Decorator : public Component {
public:
explicit Decorator(std::uniqueptr
void Operation() override {
if (component_) {
component_->Operation();
}
}
virtual ~Decorator() = default;
private:
std::uniqueptr
class ConcreteDecoratorA final : public Decorator {
public:
explicit ConcreteDecoratorA(std::unique_ptr
void Operation() override {
Decorator::Operation();
addedState = "New State";
std::cout << "concrete decorator A operation\n";
}
private: std::string addedState; };
class ConcreteDecoratorB final : public Decorator {
public:
explicit ConcreteDecoratorB(std::unique_ptr
void Operation() override {
Decorator::Operation();
AddedBehavior();
}
private: void AddedBehavior() { std::cout << “B AddedBehavior\n”; } };
auto main(void) -> int {
std::unique_ptr
d1->Operation();
d2->Operation();
return 0;
}
``
如果需要对 Decorator 持有的待装饰对象进行装饰(更改),可以在 Decorator 类中增加
getComponent()和
setComponent()`成员函数。
当然,如果只有一个 ConcreteComponent 类,没有抽象的 Component 类,那么 Decorator 类可以是 ConcreteComponent 的一个子类。