/************************************************************************ * 代理模式学习笔记[C++] * Author: 陈相礼 * Time: 2009.12.03 * Compiler: VC8 ************************************************************************/ // 测试宏 #define _TEST_ #ifdef _TEST_ #define _NOAGENT_ #else #define _THEORY_ #endif #ifndef _NOAGENT_ #include "AgentPattern1.h" #else #include "AgentPattern2.h" #endif #ifdef _THEORY_ #include "AgentPattern.h" #endif #include <iostream> using namespace std; void main( void ) { #ifdef _THEORY_ //------------------代理模式原理类测试------------------- CProxy *proxy = new CProxy(); proxy->vRequest(); delete(proxy); #endif #ifndef _NOAGENT_ //------------------无代理模式类测试------------------- CSchoolGirl llh( "llh" ); CPursuit rainleaf( llh ); rainleaf.vGiveDolls(); rainleaf.vGiveFlowers(); rainleaf.vGiveChocolate(); #else //------------------代理模式类测试------------------- CSchoolGirl llh( "llh" ); CProxy proxy( llh ); proxy.vGiveDolls(); proxy.vGiveFlowers(); proxy.vGiveChocolate(); #endif } /************************************************************************ * 小结:[代理模式应用] * 1、远程代理,也就是为一个对象在不同的地址空间提供局部代理对象。 * 这样可以隐藏一个对象存在于不同地址空间的事实。 * 2、虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需 * 要很长时间的真实对象。 * 3、安全代理,用来控制真实对象访问时的权限。 * 4、智能指引,是指当调用真实的对象时,代理处理另外一些事。 ************************************************************************/ #pragma once /********************************************** * 代理模式原理: * 为其他对象提供一种代理以控制对这个对 * 象的访问。 ***********************************************/ #include <iostream> #include <string> using namespace std; //--------------------------------------------- // Subject接口 // 定义了RealSubject和Proxy的公共接口,这样 // 就在任何使用RealSubject的地方都可以使用Proxy。 class ISubject { public: virtual void vRequest() = 0; }; //--------------------------------------------- // CRealSubject类 // 定义Proxy所代表的真实实体。 class CRealSubject : public ISubject { public: // 真实的请求 void vRequest() { cout << "真实的请求!" << endl; } protected: private: }; //--------------------------------------------- // CProxy类 // 保存一个引用使得代理可以访问实体,并 // 提供一个与Subject的接口相同的接口,这样 // 代理就可以用来代替实体。 class CProxy : public ISubject { public: CProxy() : prealSubject(NULL) {}; ~CProxy() { if ( NULL != prealSubject ) { delete( prealSubject ); prealSubject = NULL; } } void vRequest() { if ( NULL == prealSubject ) { prealSubject = new CRealSubject(); } prealSubject->vRequest(); } protected: private: CRealSubject *prealSubject; }; #pragma once /******************************** * * 无代理模式应用:追女孩子 * ********************************/ #include <iostream> #include <string> using namespace std; // 被追求者类 class CSchoolGirl { public: CSchoolGirl( string name ) : m_name(name) {}; string strGetName() { return m_name; }; void vSetName( string name ) { m_name = name; }; protected: private: string m_name; }; // 追求者类 class CPursuit { public: CPursuit( CSchoolGirl mm ) : m_mm(mm) {}; // 送礼物 void vGiveDolls() { cout << m_mm.strGetName() << " 送你洋娃娃!" << endl; } void vGiveFlowers() { cout << m_mm.strGetName() << " 送你鲜花!" << endl; } void vGiveChocolate() { cout << m_mm.strGetName() << " 送你巧克力!" << endl; } protected: private: CSchoolGirl m_mm; }; #pragma once /******************************** * * 代理模式应用:追女孩子 * ********************************/ #include <iostream> #include <string> using namespace std; // 送礼接口 class IGiveGift { public: virtual void vGiveDolls() = 0; virtual void vGiveFlowers() = 0; virtual void vGiveChocolate() = 0; }; // 被追求者类 class CSchoolGirl { public: CSchoolGirl(){}; CSchoolGirl( string name ) : m_name(name) {}; string strGetName() { return m_name; }; void vSetName( string name ) { m_name = name; }; protected: private: string m_name; }; // 追求者类 class CPursuit : public IGiveGift { public: CPursuit(){}; CPursuit( CSchoolGirl mm ) : m_mm(mm) {}; void vSet( CSchoolGirl mm ) { m_mm = mm; }; // 送礼物 void vGiveDolls() { cout << m_mm.strGetName() << " 送你洋娃娃!" << endl; } void vGiveFlowers() { cout << m_mm.strGetName() << " 送你鲜花!" << endl; } void vGiveChocolate() { cout << m_mm.strGetName() << " 送你巧克力!" << endl; } protected: private: CSchoolGirl m_mm; }; // 代理类 class CProxy : public IGiveGift { public: CProxy( CSchoolGirl mm ) { mp_gg = new CPursuit( mm ); }; ~CProxy() { if ( NULL != mp_gg ) { delete(mp_gg); mp_gg = NULL; } } // 送礼物 void vGiveDolls() { mp_gg->vGiveDolls(); } void vGiveFlowers() { mp_gg->vGiveFlowers(); } void vGiveChocolate() { mp_gg->vGiveChocolate(); } protected: private: CPursuit *mp_gg; };