码迷,mamicode.com
首页 > 编程语言 > 详细

23 DesignPatterns学习笔记:C++语言实现 --- 2.3 Decorator

时间:2016-07-22 22:45:38      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

23 DesignPatterns学习笔记:C++语言实现 --- 2.3 Decorator

2016-07-22

(www.cnblogs.com/icmzn)


模式理解

 技术分享

 1. Decorator 模式定义
    一般可以分为4个角色
    (1)Component抽象类:定义被装饰者的抽象行为或者特征。
    (2)具体的Component类:具体的待被装饰的对象。
    (3)抽象的Decorator类:
    抽象装饰者需要继承抽象Component类,以拥有Component相同的行为和特征,便于具体的Decorator继承,在具体的Decorator的继承方法中,进行行为装饰。
    抽象Decorator中的成员需要定义为Protected,这样在子类中才能够访问。
    (4)具体的Decorator类:不同的场景使用不同的具体的装饰者类。
    特征:AbsDecorator继承AbsComponent,并且具体的Cdecorator继承自ABSDecorator,所以这三个角色拥有共同的操作方法,但是在
    具体Decorator中的component方法,可以被具体的Decorator装饰修改。

2. Decorator 优点
(1)扩展相当容易,不但AbsComponent可以派生出多种的“被装饰者”,而且AbsDecorator也可以派生出具体的Decorator,
总的来说:不同的具体Decorator可以任意的方法装饰“具体的component”的规范操作方法。

3. Decorator 适用场景

4. Decorator 讨论
(1)Decorator模式同样在某些情况下,比使用继承多态效果好,因为Decorator更灵活,且继承容易产生问题。
比如继承多态使用时,引起的问题是:通过父类的指针多态的调用子类的个性化接口,所以这样就必须在父类中添加不同子类中的不同的个性化接口
这样,在父类中就众多派生子类中就会出现与自己无关的接口,并且这种情况是无法避免。所以Decorator就非常灵活地应对“被装饰者Component”的个性化问题。
只需要在具体的Decorator中添加相应的个性化接口,然后完成相应“被装饰者”的常规接口的多态调用,用AbsComponent的指针。


 程序实现(C++)

 component.h

 1 #pragma once
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class CAbsComponent
 6 {
 7 public:
 8     virtual void componentOperation() = 0;
 9 };
10 
11 //具体的被装饰者的类对象
12 class CCompontentA : public CAbsComponent
13 {
14 public:
15     void componentOperation() override
16     {
17         cout << "*******被装饰者的具体的的操作*********" << endl;
18     }
19 };
20 
21 //还可以扩展其他component类...

decorator.h

 1 #pragma once
 2 #include <iostream>
 3 #include "Compontent.h"
 4 class CAbsDecorator : public CAbsComponent
 5 {
 6 public:
 7     CAbsDecorator()
 8     {
 9         m_pComponent = nullptr;
10     }
11     CAbsDecorator(CAbsComponent* pComponent)
12     {
13         m_pComponent = pComponent;
14     }
15     ~CAbsDecorator()
16     {
17         delete m_pComponent;
18     }
19 public:
20     //
21     virtual void componentOperation() override
22     {
23         _ASSERT(m_pComponent);
24         m_pComponent->componentOperation();
25     }
26 protected:
27     //这样在抽象Decorator的子类中才能够进行引用,病对具体的继承的方法进行装饰
28     CAbsComponent* m_pComponent;
29 };
30 
31 //具体的装饰者,可以通过不同的行为装饰,被装饰者的行为
32 class CDecoratorADef : public CAbsDecorator
33 {
34 public:
35     CDecoratorADef(CAbsComponent* pComponent) :CAbsDecorator(pComponent){};
36 public:
37     //特殊的装饰行为,可以任意修改
38     void doSpecialPre() 
39     {
40         cout << "AAAAA特殊的特殊行为,可以任意修改,。" << endl;
41     }
42     //
43     void componentOperation() override
44     {
45         cout << "可以通过继承的方式,操作组合对象的同种属性(特殊操作在之前)" << endl;
46         doSpecialPre();
47         m_pComponent->componentOperation();
48     }
49 };
50 
51 
52 //具体的装饰者,可以通过不同的行为装饰,被装饰者的行为
53 class CDecoratorBDef : public CAbsDecorator
54 {
55 public:
56     CDecoratorBDef(CAbsComponent* pComponent) :CAbsDecorator(pComponent){};
57 public:
58     void doSpecialEnd()
59     {
60         cout << "BBBBB特殊的特殊行为,可以任意修改,。" << endl;
61     }
62     //特殊的装饰行为,可以任意修改
63     void componentOperation()
64     {
65         cout << "可以通过继承的方式,操作组合对象的同种属性(特殊操作在之后)" << endl;
66         m_pComponent->componentOperation();//组合的被装饰者的行为,
67         doSpecialEnd();
68     }
69 };

 


(1)模板应用

 main.cpp

 1 // Decorator.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "DecoratorDef.h"
 6 
 7 #include <iostream>
 8 using namespace std;
 9 
10 
11 int _tmain(int argc, _TCHAR* argv[])
12 {
13     cout << "\n用A装饰器装饰ComponentA..." << endl;
14     CAbsDecorator* pDecorator = new CDecoratorADef(new CCompontentA());
15     pDecorator->componentOperation();
16     delete pDecorator;
17 
18     
19     cout << "\n用B装饰器装饰ComponentA..." << endl;
20     pDecorator = new CDecoratorBDef(new CCompontentA());
21     pDecorator->componentOperation();
22     delete pDecorator;
23 
24     system("pause");
25     return 0;
26 }

 

(2)输出展示

 技术分享

 

23 DesignPatterns学习笔记:C++语言实现 --- 2.3 Decorator

标签:

原文地址:http://www.cnblogs.com/icmzn/p/5697218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!