装饰器模式(Decorator Pattern)
# 装饰器模式(Decorator Pattern)
# 概念
装饰器模式是一种结构型设计模式,它允许在不改变对象接口的情况下动态地给对象添加新的行为。通过将对象包装在一个装饰器类中,可以在运行时向对象添加额外的功能。
# 思想
装饰器模式通过组合的方式,在运行时动态地扩展对象的功能。它使用了递归组合的原则,将核心对象放在一个基础装饰器中,并在需要的时候逐层包装。这样,可以对对象进行灵活的功能扩展,同时保持对象接口的一致性。
# 角色
- Component(组件): 定义了被装饰对象的接口,可以是抽象类或接口。
- ConcreteComponent(具体组件): 实现了Component接口,是被装饰的对象。
- Decorator(装饰器): 继承自Component,拥有一个Component对象,并在其基础上扩展新的行为。
- ConcreteDecorator(具体装饰器): 扩展Decorator的功能,实现新的行为。
# 优点
- 可以在运行时动态地扩展对象的功能,而无需改变其接口。
- 具有更好的灵活性,可以通过组合不同的装饰器类来实现不同的功能组合。
- 遵循开放封闭原则,无需修改现有代码,就可以在不影响其他对象的情况下添加新功能。
# 缺点
- 多层装饰器的嵌套可能会导致代码复杂化。
- 如果使用不当,可能会导致大量的小类对象产生,增加了系统的复杂性。
# 类图
@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
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
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
2
示例代码通过装饰器模式实现了动态地扩展汽车对象的功能,同时保持了接口的一致性。可以根据需要,通过组合不同的装饰器类来添加不同的车辆配件,实现灵活的功能组合。
编辑 (opens new window)
上次更新: 2023/06/09, 13:17:31
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05