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!

9.装饰器模式

2026-01-22
581 字 · 3 分钟

已复制链接

评论区

目录