9.装饰器模式
设计模式——装饰器模式
一、基本概念
1. 定义
修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
2. 优缺点
优点:
- 是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用;
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果;
- 装饰器模式完全遵守开闭原则。
缺点:
- 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
3. 结构
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象;
- 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责;
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能;
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
classDiagram
class Component {
<<abstract>>
+operation() void
}
class ConcreteComponent {
+operation() void
}
class Decorator {
<<abstract>>
-Component component
+operation() void
}
class ConcreteDecorator {
+operation() void
}
Component <|-- ConcreteComponent
Component <|-- Decorator
Decorator <|-- ConcreteDecorator
Decorator o--> Component : 聚合
二、代码实现
抽象构件角色
class Component {public: virtual ~Component() = default; virtual void operation() = 0;};具体构件角色
class ConcreteComponent : public Component {public: ConcreteComponent() { std::cout << "创建具体的构建角色..." << std::endl; }
void operation() override { std::cout << "原有功能!" << std::endl; }};抽象装饰角色
class Decorator : public Component {public: Decorator(std::unique_ptr<Component> component) : component(std::move(component)) {}
void operation() override { component->operation(); }
private: std::unique_ptr<Component> component;};具体装饰角色
class ConcreteDecorator : public Decorator {public: ConcreteDecorator(std::unique_ptr<Component> component) : Decorator(std::move(component)) {}
void operation() override { Decorator::operation(); addFunction(); }
void addFunction() { std::cout << "额外功能!" << std::endl; }};客户类
#include <iostream>#include <memory>
int main() { std::unique_ptr<Component> component = std::make_unique<ConcreteComponent>(); component->operation(); std::cout << "--------------" << std::endl; std::unique_ptr<Component> component1 = std::make_unique<ConcreteDecorator>(std::move(component)); component1->operation(); return 0;}运行结果:
创建具体的构建角色...原有功能!--------------原有功能!额外功能!参考:
Thanks for reading!