设计模式(5)-己所不欲,施之于人(代理模式)
什么是代理?在我们的日常生活中的例子非常多。
比如上网有的时候使用代理服务器,通过代理上网,这就是代理的一个非常常见的例子。
从这里边可以看到3个对象:真实网路对象,代理对象还有客户端对象。
真实对象和代理对象还都有访问网络的方法所以抽象出网络对象。
对应的类图关系如下:
如图:
真实的网络被隐藏起来,我们访问的是代理的网络对象,同时我们可以在访问代理对象的同时动态的加上比如验证用户,清除用户信息的方法。
生成的文件如下:
client.h
class Client { public : Client(); virtual ~Client(); }; |
client.cpp
#include "Client.h" #include "Network.h" #include "ProxyNetwork.h" Client::Client(){ } Client::~Client(){ } int main(){ ProxyNetwork* proxyNetwork = new ProxyNetwork(); proxyNetwork->browse(); return 0; } |
Network.h
#include <iostream> using namespace std; class Network { public : Network(); virtual ~Network(); virtual void browse() = 0; }; |
Network.cpp
#include "Network.h" Network::Network(){ } Network::~Network(){ } |
ProxyNetwork.h
#include "RealNetwork.h" #include "Network.h" class ProxyNetwork : public Network { public : ProxyNetwork(); virtual ~ProxyNetwork(); RealNetwork* realNetwork; virtual void browse(); private : void checkUser(); void clearUserinfo(); }; |
ProxyNetwork.cpp
#include "ProxyNetwork.h" ProxyNetwork::ProxyNetwork(){ } ProxyNetwork::~ProxyNetwork(){ } void ProxyNetwork::browse(){ ProxyNetwork::checkUser(); realNetwork = new RealNetwork(); realNetwork->browse(); ProxyNetwork::clearUserinfo(); } void ProxyNetwork::checkUser(){ cout<< "调用真实对象之前检验用户名" <<endl; } void ProxyNetwork::clearUserinfo(){ cout<< "调用真实对象之后清除用户信息" <<endl; } |
RealNetwork.h
#include "Network.h" class RealNetwork : public Network { public : RealNetwork(); virtual ~RealNetwork(); virtual void browse(); }; |
RealNetwork.cpp
#include "RealNetwork.h" RealNetwork::RealNetwork(){ } RealNetwork::~RealNetwork(){ } void RealNetwork::browse(){ cout<< "访问真实网路..." <<endl; } |
运行client.cpp中的main,我们得到如下:
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
代理模式的几种应用场景:
1,远程代理,为一个对象在不同的空间提供局部代表,隐藏真实对象,webservice的调用就是一个最好的例子。
2,虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。浏览网页时,我们访问缓存中的对象就是其中一个例子。
3,安全代理,控制真实对象的访问权限,不让外部看到真实的网络情况。上边的例子就是一个比较好的实例。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架