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