设计模式 Design Parttern ——装饰模式Decorator http://blog.youkuaiyun.com/leeidea 1:头文件 #ifndef _DECORATOR_H_VANEY_ #define _DECORATOR_H_VANEY_ #include <iostream> using namespace std; /****************************************************************** 名称 :Decorator.h 版本 :1.00 描述 :演示装饰模式的概念 作者 :vaney.li@gmail.com http://blog.youkuaiyun.com/leeidea 日期 :2010年10月20日 版权 :vaney.li@gmail.com http://blog.youkuaiyun.com/leeide ******************************************************************/ /* 官方解释:The Decorator attaches additional responsibilities to an object dynamically. 我的理解:当系统需要增加新的功能的时候,可以向旧类中添加新的代码。这些新加的代码通常装饰了原 有类的核心职责或者主要行为,但是这样会增加主类的复杂度。装饰模式为我们提供了一个非常 好的解决方案,他把每个要装饰的功能放在的单独的类中,并让这个类包装他所要装饰的对象, 因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰 功能包装对象了 我的应用:举例,原始的函数是把密码明文的存进数据库,经过不同的加密装饰后在存入数据库 */ //需要装饰的类 class CPassword { public: CPassword() { cout << "CPassword" << endl; } virtual ~CPassword() { cout << "~CPassword" << endl; } public: //需要子类实现的方法 virtual void Store() { //直接存入数据库,如果需要加密后在存呢 cout << "Store" << endl; } }; //抽象装饰类 class CSafePassword : public CPassword { public: CSafePassword() { cout << "CSafePassword()" << endl; } virtual ~CSafePassword() { cout << "~CSafePassword()" << endl; } public: int DecoratePw(CPassword* p) { m_pw = p; cout << "DecoratePw" << endl; return 1; } void Store() { if(m_pw) m_pw->Store(); } protected: CPassword* m_pw; }; //MD5加密 class CMD5: public CSafePassword { void MD5() { cout << "CMD5 MD5" << endl; } public: CMD5() { cout << "CMD5()" << endl; } virtual ~CMD5() { cout << "~CMD5()" << endl; } public: virtual void Store() { MD5(); cout << "CHat Show" << endl; CSafePassword::Store(); } }; //移位加密 class CEncode : public CSafePassword { void Encode() { cout << "CEncode Encode" << endl; } public: CEncode() { cout << "CEncode()" << endl; } virtual ~CEncode() { cout << "~CEncode()" << endl; } public: virtual void Store() { Encode(); cout << "CEncode Store" << endl; CSafePassword::Store(); } }; #define C_API extern "C" //用户 C_API int UsingDR(); #endif 2:源文件 #include "Decorator.h" C_API int UsingDR() { CPassword pw; CMD5 md; CEncode encode; md.DecoratePw(&pw); encode.DecoratePw(&md); encode.Store(); return 1; } 3:用户文件main.c extern int UsingDR(); //系统默认入口 int _tmain(int argc, _TCHAR* argv[]) { return UsingDR(); }