长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 装饰器模式(Decorator Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 示例代码
      • 示例代码描述
    • 外观模式(Facade Pattern)
    • 享元模式(Flyweight Pattern)
    • 代理模式(Proxy Pattern)
  • 行为型模式

  • 设计模式
  • 结构型模式
DC Wang
2023-05-28
目录

装饰器模式(Decorator Pattern)

# 装饰器模式(Decorator Pattern)

# 概念

装饰器模式是一种结构型设计模式,它允许在不改变对象接口的情况下动态地给对象添加新的行为。通过将对象包装在一个装饰器类中,可以在运行时向对象添加额外的功能。

# 思想

装饰器模式通过组合的方式,在运行时动态地扩展对象的功能。它使用了递归组合的原则,将核心对象放在一个基础装饰器中,并在需要的时候逐层包装。这样,可以对对象进行灵活的功能扩展,同时保持对象接口的一致性。

# 角色

  1. Component(组件): 定义了被装饰对象的接口,可以是抽象类或接口。
  2. ConcreteComponent(具体组件): 实现了Component接口,是被装饰的对象。
  3. Decorator(装饰器): 继承自Component,拥有一个Component对象,并在其基础上扩展新的行为。
  4. ConcreteDecorator(具体装饰器): 扩展Decorator的功能,实现新的行为。

# 优点

  1. 可以在运行时动态地扩展对象的功能,而无需改变其接口。
  2. 具有更好的灵活性,可以通过组合不同的装饰器类来实现不同的功能组合。
  3. 遵循开放封闭原则,无需修改现有代码,就可以在不影响其他对象的情况下添加新功能。

# 缺点

  1. 多层装饰器的嵌套可能会导致代码复杂化。
  2. 如果使用不当,可能会导致大量的小类对象产生,增加了系统的复杂性。

# 类图

@startuml

class Client {
    +operation()
}

interface Component {
    +operation()
}

class ConcreteComponent {
    +operation()
}

class Decorator {
    -component: Component
    +operation()
}

class ConcreteDecorator {
    +operation()
}

note top of Component: 定义被装饰对象的接口\n可以是抽象类或接口
note top of ConcreteComponent: 实现Component接口\n被装饰的对象
note top of Decorator: 继承Component\n拥有一个Component对象\n并在其基础上扩展新行为
note top of ConcreteDecorator: 扩展Decorator的功能\n实现新的行为

Client --> Component
Component <|.. ConcreteComponent
Component <|.. Decorator
Decorator --> Component
Decorator <|.. ConcreteDecorator

@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 示例代码

#include <iostream>
using namespace std;

// Component
class Car {
public:
    virtual void assemble() = 0;
};

// ConcreteComponent
class BasicCar : public Car {
public:
    void assemble() {
        cout << "基本车辆组装完成。" << endl;
    }
};

// Decorator
class CarDecorator : public Car {
protected:
    Car* car;
public:
    CarDecorator(Car* car) : car(car) {}

    void assemble() {
        car->assemble();
    }
};

// ConcreteDecorator
class SportsCar : public CarDecorator {
public:
    SportsCar(Car* car) : CarDecorator(car) {}

    void assemble() {
        CarDecorator::assemble();
        cout << "添加运动车配件。" << endl;
    }
};

int main() {
    Car* car = new SportsCar(new BasicCar());
    car->assemble();

    delete car;
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 示例代码描述

以上示例代码是一个简单的汽车组装示例。在该示例中,我们有一个抽象基类Car作为组件(Component),定义了一个assemble方法。BasicCar是具体组件(ConcreteComponent),实现了Car接口并定义了基本的车辆组装过程。

CarDecorator是装饰器(Decorator),继承自Car,并包含一个指向Car对象的成员变量。它重写了assemble方法,并在其中调用基础组件的assemble方法。SportsCar是具体装饰器(ConcreteDecorator),扩展了CarDecorator的功能,添加了额外的运动车配件。

在主函数中,我们创建了一个SportsCar对象,将其包装在一个BasicCar对象上。调用assemble方法时,会首先执行基本车辆的组装过程,然后添加运动车配件。运行该示例代码,输出结果如下:

基本车辆组装完成。
添加运动车配件。
1
2

示例代码通过装饰器模式实现了动态地扩展汽车对象的功能,同时保持了接口的一致性。可以根据需要,通过组合不同的装饰器类来添加不同的车辆配件,实现灵活的功能组合。

编辑 (opens new window)
#设计模式#结构型模式
上次更新: 2023/06/09, 13:17:31
组合模式(Composite Pattern)
外观模式(Facade Pattern)

← 组合模式(Composite Pattern) 外观模式(Facade Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式