简单了解设计模式中的装饰者模式及C++版代码实现

2025-05-27 0 51

由遇到的问题引出的装饰模式

在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。

而装饰提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。

有关这些内容在讨论中进一步阐述。
模式选择
装饰模式典型的结构图为:

简单了解设计模式中的装饰者模式及C++版代码实现

在 结 构 图 中 , ConcreteComponent 和装饰需 要 有 同 样 的 接 口 , 因 此ConcreteComponent 和装饰有着一个共同的父类。这里有人会问,让装饰直接维护一个指向 ConcreteComponent 引用(指针)不就可以达到同样的效果,答案是肯定并且是否定的。肯定的是你可以通过这种方式实现,否定的是你不要用这种方式实现,因为通过这种方式你就只能为这个特定的 ConcreteComponent 提供修饰操作了,当有了一个新的ConcreteComponent 你 又 要 去 新 建 一 个装饰来 实 现 。 但 是 通 过 结 构 图 中 的ConcreteComponent 和装饰有一个公共基类,就可以利用 OO 中多态的思想来实现只要是 Component 型别的对象都可以提供修饰操作的类,这种情况下你就算新建了 100 个Component 型别的类 ConcreteComponent,也都可以由装饰一个类搞定。这也正是装饰模式的关键和威力所在了。

当然如果你只用给 Component 型别类添加一种修饰,则装饰这个基类就不是很必要了。

实例

?

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

48

49

50

51

52

53

54
#include <iostream>

using namespace std;

class TestA

{

public:

void display_a()

{

cout<<"display a..."<<endl;

}

};

class TestB

{

public:

void display_b()

{

cout<<"display b..."<<endl;

}

};

class Facade

{

TestA *testa;

TestB *testb;

public:

Facade()

{

testa = new TestA();

testb = new TestB();

}

~Facade()

{

delete testa;

delete testb;

}

void MethodA()

{

testa->display_a();

testb->display_b();

}

};

int main()

{

Facade *facade = new Facade();

facade->MethodA();

system("pause");

return 0;

}

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 简单了解设计模式中的装饰者模式及C++版代码实现 https://www.kuaiidc.com/75111.html

相关文章

发表评论
暂无评论