gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章简单了解设计模式中的装饰者模式及C++版代码实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

在 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;
}

最后此篇关于简单了解设计模式中的装饰者模式及C++版代码实现的文章就讲到这里了,如果你想了解更多关于简单了解设计模式中的装饰者模式及C++版代码实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com