C++设计模式[八]装饰模式
2015-11-09 20:25
357 查看
在GOF的《设计模式:可复用面向对象软件的基础》一书中对装饰模式是这样说的:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。它使得我们可以给某个对象而不是整个类添加一些功能。
![](http://hi.csdn.net/attachment/201108/9/0_13128725192ROQ.gif)
在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现:
![](http://hi.csdn.net/attachment/201108/9/0_13128725192ROQ.gif)
在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现:
#include "stdafx.h" #include <iostream> #include<string> using namespace std; //公共抽象类 class Phone { public: Phone() {} virtual ~Phone() {} virtual void ShowDecorate() {} }; //具体的手机类 class iPhone : public Phone { private: string m_name; //手机名称 public: iPhone(string name) : m_name(name){} ~iPhone() {} void ShowDecorate() { cout << m_name << "的装饰" << endl; } }; //具体的手机类 class NokiaPhone : public Phone { private: string m_name; public: NokiaPhone(string name) : m_name(name){} ~NokiaPhone() {} void ShowDecorate() { cout << m_name << "的装饰" << endl; } }; //装饰类 class DecoratorPhone : public Phone { private: Phone *m_phone; //要装饰的手机 public: DecoratorPhone(Phone *phone) : m_phone(phone) {} virtual void ShowDecorate() { m_phone->ShowDecorate(); } }; //具体的装饰类 class DecoratorPhoneA : public DecoratorPhone { public: DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone) {} void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); } private: void AddDecorate() { cout << "增加挂件" << endl; } //增加的装饰 }; //具体的装饰类 class DecoratorPhoneB : public DecoratorPhone { public: DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {} void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); } private: void AddDecorate() { cout << "屏幕贴膜" << endl; } //增加的装饰 }; int main() { Phone *iphone = new NokiaPhone("6300"); Phone *dpa = new DecoratorPhoneA(iphone); //装饰,增加挂件 Phone *dpb = new DecoratorPhoneB(dpa); //装饰,屏幕贴膜 dpb->ShowDecorate(); delete dpa; delete dpb; delete iphone; return 0; }装饰模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。装饰模式提供了一种“即用即付”的方法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用装饰类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。
相关文章推荐
- C++学习——父类指针和子类指针的步长问题
- C++学习路线
- c与c++中enum和struct定义的区别
- C++学习——多态原理
- C语言笔记(结构体与offsetof、container_of之前的关系)
- 栈在程序中的作用(ARM结构)
- NOJ 5538 c语言
- NOJ 5533 c语言
- c语言实现素数
- 8数码问题的C++解决方案
- C++调试时要让窗口一直打开的方法
- C++计算中值图像,增量算法
- 匈牙利算法的C++实现
- C++ 二值图像连通区域标记
- c语言中统计二进制位中1的个数的算法优化
- C++ Primer 学习笔记——数组
- C++实现DPM/LatentSVM 完整代码下载 --- 第三篇
- C++实现cascade DPM --- 第二篇
- C++实现DPM/latentSVM --- 第一篇
- C++强大的背后