年过完了,开始上班了,时间过得太快了,感觉过了个假年........
代理模式:为其他对象提供一种代理,以控制这个对象的访问。
角色分工:Subject:抽象角色,声明对真实对象和代理对象的共同接口;Proxy:代理角色,代理真实对象的访问;RealSubject:真实角色,最终需要引用的对象。
代理模式主要分为四类:远程代理、虚代理、保护代理、智能引用。
下面笔记,主要记录虚代理,关于远程代理、保护代理、智能引用等,可以查查资料,其核心思想都是跟其定义一样。特别提下,智能引用其实跟可以参考智能指针的实现,采用引用计数,可以参考:http://www.cnblogs.com/huiz/p/8313209.html
虚代理:可以缓存实体的附加信息,以便延迟对它的访问,直到我们真正需要一个对象的时候才创建它。
例如:在项目中,我们经常需要加载资源,在开机就立即加载所有的资源,会导致一些性能问题,如开机时间太长等,有需要需要在真正需要的时候再去加载resources,我们可以定义代理类,在代理类里面加载真实对象的resources,这样就可以实现延迟加载。具体可以看UML类图:
再看看代码:
#include <iostream> using namespace std; class Base //Subject { public: virtual void requestLoader() = 0; virtual ~Base(){} }; class Control : public Base //RealSubject { public: virtual void requestLoader() { cout<<"request loader resources."<<endl; } }; class Proxy : public Base //proxy { private: Control* m_con; public: Proxy(Control* con):m_con(con){} virtual void requestLoader() { m_con->requestLoader(); } ~Proxy() { if(NULL != m_con) { delete m_con; m_con = NULL; } } }; int main(int argc, char** argv) { Control* con = new Control; Proxy* pr = new Proxy(con); pr->requestLoader(); delete pr; pr = NULL; return 0; }
输出如下:
以上代码在VC6.0上运行通过,如有问题,还请多多指教,在此先谢过了哈。