代理模式简介
代理模式(proxy),为其他对象提供了一种代理以控制对这个对象的访问。
代理模式的应用:
1.远程代理:也就是为一个对象在不同的地址空间提供据图代表。这样可以隐藏一个对象存在于不同地址空间的事实。比如VPN
2.虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的实例对象。比如打开网页时,图片不是一下全部下载下来,而是随着你的浏览,逐步下载。
3.安全代理:用来控制真是对象访问时的权限,一般用于对象具有不同的访问权限的时候。
4.智能指引:是指当调用真实的对象时,代理处理另外的一些事。比如智能指针。
代理模式UML图
Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用Realsubject的方法都可以使用Proxy。
C++代码示例
//Subject类,定义代理类和被代理类的接口 #ifndef _SUBJECT_HPP #define _SUBJECT_HPP class Subject{ public: virtual void method1() = 0; virtual void method2() = 0; }; #endif
//被代理类RealSubject,含具体实现 #ifndef _REALSUBJECT_HPP #define _REALSUBJECT_HPP #include<iostream> #include"subject.hpp" class RealSubject : public Subject{ public: void method1() override { std::cout<< "realsubject.method1() is called"<<std::endl; } void method2()override { std::cout << "realsubject.method2() is called"<<std::endl; } }; #endif
//代理类Proxy #ifndef _PROXY_HPP #define _PROXY_HPP #include"realsubject.hpp" #include"subject.hpp" class Proxy : public Subject{ public: void method1() override{ realsubject.method1(); } void method2() override{ realsubject.method2(); } private: RealSubject realsubject; }; #endif
//客户端代码 #include"proxy.hpp" int main(){ Proxy proxy; proxy.method1(); proxy.method2(); getchar(); return 0; }
运行结果