10 结构型模式-----装饰模式
2015-06-03 11:51
435 查看
模式动机(Decorator Pattern):我们在给一个类进行功能扩展时,总是通过继承或者复合关系,使得一个类具有其他相关类型的功能,继承本身属于静态关联,派生类比较臃肿,使用者也不能控制增加功能的方式。而使用复合机制,即将一个类的对象作为另一个类的成员,我们可以决定什么时候调用哪种功能,非常方便,这就是装饰模式,即给一个现有的类进行装饰,使其具有我们希望的功能。
模式结构图:
模式代码:
bt_装饰模式.h:
测试用例.cpp:
模式优缺点:
1》 相比于静态继承扩展,装饰器模式可以提供更多的灵活性,它允许客户在运行时添加装饰功能,而继承则是在静态编译时就确定了,再者,多重继承时虽然很多功能派生类用不到,但是仍然不得不处理。相比而言,装饰器可以通过多个不同的装饰类来装饰组件从而添加不同的新功能,扩展非常方便。
2》 组件层次和装饰层次耦合性比较低,可以独立发展,通过搭配不同的具体组件和具体装饰器可以实现不同的组合,新增时不需要改变源代码,符合“开闭原则”。
3》 装饰模式比较麻烦,使用时可能需要创建多个装饰类对象,使得系统设计复杂度增大;若多次级联调用装饰器,一旦出错必须逐级排查。
模式结构图:
模式代码:
bt_装饰模式.h:
#ifndef DP_H #define DP_H #include <iostream> using namespace std; /* 抽象组件类 */ class Component { public: virtual ~Component(){ } virtual void Operation(){ } }; /* 具体组件类 */ class ConcreteComponent : public Component { public: virtual void Operation() { cout << "具体组件类的功能" << endl; } }; /* 抽象装饰器类:维护一个指向抽象组件类的指针, 并定义一个与抽象组件类一致的接口 */ class Decorator : public Component { public: Decorator(Component* pCom) : component(pCom){ } virtual void Operation() { component->Operation(); // 调用抽象组件类的功能 } private: Component* component; }; /* 具体装饰器:负责对组件进行装饰以添加新功能 */ class ConcreteDecoratorA : public Decorator { public: ConcreteDecoratorA(Component* pCom, int state = 0) : Decorator(pCom), addedState(state){ } virtual void Operation() { Decorator::Operation(); cout << "装饰器A为组件新增状态 = " << addedState << endl; } private: int addedState; }; class ConcreteDecoratorB : public Decorator { public: ConcreteDecoratorB(Component* pCom) : Decorator(pCom){ } virtual void Operation() { Decorator::Operation(); AddedBehavior(); } private: void AddedBehavior() // 具体装饰器新增的功能 { cout << "装饰器B为组件新增功能" << endl; } }; #endif // DP_H
测试用例.cpp:
#include "bt_装饰模式.h" int main() { cout << "***** 装饰模式测试 *****" << endl; Component* pCom = new ConcreteComponent; pCom->Operation(); // 未装饰时 cout << endl; cout << "装饰器A" << endl; Decorator* pDec1 = new ConcreteDecoratorA(pCom); pDec1->Operation(); // 第一次装饰后 cout << endl; cout << "装饰器B" << endl; Decorator* pDec2 = new ConcreteDecoratorB(pDec1); pDec2->Operation(); // 第二次装饰后 delete pDec2; delete pDec1; delete pCom; return 0; }
模式优缺点:
1》 相比于静态继承扩展,装饰器模式可以提供更多的灵活性,它允许客户在运行时添加装饰功能,而继承则是在静态编译时就确定了,再者,多重继承时虽然很多功能派生类用不到,但是仍然不得不处理。相比而言,装饰器可以通过多个不同的装饰类来装饰组件从而添加不同的新功能,扩展非常方便。
2》 组件层次和装饰层次耦合性比较低,可以独立发展,通过搭配不同的具体组件和具体装饰器可以实现不同的组合,新增时不需要改变源代码,符合“开闭原则”。
3》 装饰模式比较麻烦,使用时可能需要创建多个装饰类对象,使得系统设计复杂度增大;若多次级联调用装饰器,一旦出错必须逐级排查。
相关文章推荐
- 指针基本操作
- SVN: svn:externals
- 股票模拟买卖
- Android如何区别真机和模拟器
- Java调用C/C++实现的DLL动态库——JNI(转)
- iOS逆向 - 工具篇
- N皇后问题的两个最高效的算法
- 用js转换joson返回数据库的时间格式为/Date(*************)/
- 日记-SEO工作1
- 设置地址栏小图标
- JavaScript中的条件判断语句使用详解
- Android 对Layout_weight属性完全解析以及使用ListView来实现表格(自定义适配器)
- CEPH HEALTH错误(二):HEALTH_WARN mds cluster is degraded
- 移动交换中心(MSC/VLR) .
- ViewPage使用PagerTabStrip来做标题的疑问
- 数据运营报表系统思考 一二
- js光标
- C++里的构造函数为什么不能为虚函数
- 资源分享redis中文入门手册
- 九度OJ-题目1389:变态跳台阶