目录
- 问题
- 解决方案
- 结构
- 代码
代理是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。
问题
为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象,你只是偶尔需要使用它,并非总是需要。
你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。
在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现:比如类可能是第三方封闭库的一部分。
解决方案
代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。
这有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。
结构
代码
#include <iostream>
#include <memory>
using namespace std;class ServiceInterface{
public:virtual void operation()=0;virtual ~ServiceInterface(){}
};
class Service:public ServiceInterface{
public:void operation(){cout<<"真实服务的操作 \n";}
};
class Proxy:public ServiceInterface{
public:Proxy(shared_ptr<Service> realService):m_realService(realService){}bool checkAcess(){cout<<"检查访问权限 \n";return true;}void operation(){if(checkAcess()){m_realService->operation();}}
private:shared_ptr<Service> m_realService;
};int main(){auto realService=make_shared<Service>();cout<<"---真实服务操作"<<endl;realService->operation();auto proxy=make_shared<Proxy>(realService);cout<<"---代理服务操作"<<endl;proxy->operation();return 0;
}