/************************************************************************ * 装饰模式学习笔记[C++] * Author: 陈相礼 * Time: 2009.12.02 * Compiler: VC8 ************************************************************************/ #include "DecoratePattern.h" #include "DecoratePattern1.h" #include <iostream> using namespace std; int main() { //------------------装饰模式原理类测试------------------- CConcreteComponent *cc = new CConcreteComponent(); CConcreteDecoratorA *ca = new CConcreteDecoratorA(); CConcreteDecoratorB *cb = new CConcreteDecoratorB(); ca->vSetComponent( cc ); cb->vSetComponent( ca ); cb->vOperation(); delete(cc); delete(ca); delete(cb); //------------------换装类测试------------------- CPerson *cp = new CPerson( "Rainleaf" ); cout << "第一种装束:" << endl; // 获取装束 CSneakers *csk = new CSneakers(); CTShirts *cts = new CTShirts(); CBigTrouser *cbt = new CBigTrouser(); // 开始装束 csk->vDecorate( cp ); cts->vDecorate( csk ); cbt->vDecorate( cts ); // 展示 cbt->vShow(); delete(csk); delete(cts); delete(cbt); cout << "第二种装束:" << endl; // 获取装束 CLeatherShoes *cls = new CLeatherShoes(); CTie *ct = new CTie(); CSuit *cst = new CSuit(); // 开始装束 cls->vDecorate( cp ); ct->vDecorate( cls ); cst->vDecorate( ct ); // 展示 cst->vShow(); delete(cls); delete(ct); delete(cst); return 0; } /************************************************************************ * 总结: * 1、装饰模式是为已有功能动态地添加更多功能的一种方式。 * 2、当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的 * 代码通常装饰了原有类的核心职责或主要行为。 * 3、在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的 * 复杂度,而这些新加入的东西仅仅是为了满足一些只是在某种情况下 * 才会执行的特殊行为的需要。装饰模式却提供了一个非常好的解决方 * 案,它把每个要装饰的功能在单独的类中,并让这个类包装它所要装 * 饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时 * 根据需要有选择地、按顺序地使用装饰功能包装对象。 * 4、装饰模式优点:有效地把类的核心职责和装饰功能区分开了。而且可 * 以去除相关类中重复装饰的逻辑。 ************************************************************************/ #pragma once /********************************************** * 装饰模式原理: * 动态给一个对象添加一些额外的职责,就 * 增加功能来说,装饰模式比生成子类给为灵活。 ***********************************************/ #include <iostream> using namespace std; //--------------------------------------------- // 对象接口类 // 定义一个对象接口,可以给这些对象动态 // 地添加职责。 class CComponent { public: virtual void vOperation() {}; }; //--------------------------------------------- // 具体对象类 // 定义一个具体对象,也可以给这些对象添 // 加职责。 class CConcreteComponent : public CComponent { public: void vOperation() { cout << "具体对象的操作" << endl; } }; //--------------------------------------------- // 装饰抽象类 // 从外类来扩展CComponent类的功能,但 // CComponent类无需知道CDecorator类的存在。 class CDecorator : public CComponent { public: void vSetComponent( CComponent *pcompt ) {// 设置成员变量component pcomponent = pcompt; } // 重写vOperation(),实际执行父类中的vOperation() virtual void vOperation() { if ( NULL != pcomponent ) { pcomponent->vOperation(); } } protected: CComponent *pcomponent; }; class CConcreteDecoratorA : public CDecorator { public: void vOperation() { CDecorator::vOperation(); dwAddedState = 100; cout << "具体装饰对象A的操作" << endl; } private: // 本类独有功能,以示区<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>别 double dwAddedState; }; class CConcreteDecoratorB : public CDecorator { public: void vOperation() { CDecorator::vOperation(); vAddedBehavior(); cout << "具体装饰对象B的操作" << endl; } private: // 本类独有功能,以示区别 void vAddedBehavior() { cout << "具体装饰对象B独有的方法" << endl; } }; #pragma once /******************************** * * 装饰模式应用:形象展示 * ********************************/ #include <iostream> #include <string> using namespace std; // CPerson类(CConcreteComponent) class CPerson { public: CPerson() : strName(""){}; CPerson( string name ) : strName(name){}; virtual void vShow() { cout << "装扮的" << strName << endl; } protected: private: string strName; }; // 服饰类(CDecorator) class CFinery : public CPerson { public: // 打扮 void vDecorate( CPerson *pcompt ) { pcomponent = pcompt; } // 展示 void vShow() { if ( NULL != pcomponent ) { pcomponent->vShow(); } } protected: CPerson *pcomponent; private: }; // 具体服饰类(CConcreteDecorator) class CTShirts : public CFinery { public: void vShow() { cout << "大T恤!" << endl; CFinery::vShow(); } protected: private: }; class CBigTrouser : public CFinery { public: void vShow() { cout << "跨裤!" << endl; CFinery::vShow(); } protected: private: }; class CSneakers : public CFinery { public: void vShow() { cout << "耐克!" << endl; CFinery::vShow(); } protected: private: }; class CLeatherShoes : public CFinery { public: void vShow() { cout << "长靴!" << endl; CFinery::vShow(); } protected: private: }; class CTie : public CFinery { public: void vShow() { cout << "领带!" << endl; CFinery::vShow(); } protected: private: }; class CSuit : public CFinery { public: void vShow() { cout << "西服!" << endl; CFinery::vShow(); } protected: private: }; ——By 陈相礼 09/12/02