C++设计模式--代理模式(Proxy)
前言
C++相对其他编程语言来说算是比较难的了,相关知识点非常多,并且有些概念理解起来比较困难,对于初学者来说可能会感觉到非常痛苦。随着项目难度的升级,需要不断地优化框架从而使整个结构更具有扩展性,那么就要具备更多更深的 C++知识点才能搞定了,而设计模式是当今已经成为面向对象程序设计的几乎所有必须掌握的知识点,可以将设计模式看做解决某一类特定问题的特别巧妙和具有洞察力的方法。所以这段时间重温 C++基础知识,并做相关总结。
正文
代理模式,提供一个代理类,外部代码与代理类打交道,而做实际工作的类则隐藏在代理类的背后,当调用代理类中的一个函数时,代理类仅转而去调用实现类中的相应函数。
代理模式的逻辑很简单:代理类派生自一个基类,由平行地派生自同一个基类的一个或多个类提供实际的实现。
如下图结构:
当一个代理对象被创建的时候,一个实现对象就分配给了它,代理对象就将函数调用发给实现对象。代理模式只有一个实现类,并且代理模式控制对其实现类的访问。
来看个示例:
#include <iostream>using namespace std;class ProxyBase
{
public:virtual void f() = 0;virtual void g() = 0;virtual void h() = 0;virtual ~ProxyBase(){}
};class Implementation : public ProxyBase
{
public:void f(){cout << "Implementation.f()" << endl;}void g(){cout << "Implementation.g()" << endl;}void h(){cout << "Implementation.h()" << endl;}
};class Proxy : public ProxyBase
{
public:Proxy(){implementation = new Implementation();}~Proxy(){delete implementation;}void f(){implementation->f();}void g(){implementation->g();}void h(){implementation->h();}private:ProxyBase * implementation;
};int main()
{Proxy p;p.f();p.g();p.h();return 0;
}
在某些情况下,类Implementation并不需要与 Proxy 具有相同的接口—Proxy 类可以任意关联Implementation类并且将函数调用提交给它,这就符合了代理的基本思想。然而,使用共同的接口可以将代理的替代物插入到客户代码中–编写客户代码只用来与原对象进行通信,不需要对其进行修改以接受代理(以上示例中,Proxy 和Implementation都继承于ProxyBase,并实现其基类的虚函数)。此外,使用共同的接口Implementation被迫实现 Proxy 需要调用的所有函数。
代理模式的用途:
1.远程代理:为不同地址空间的对象提供代理。通过某些远程对象技术实现。
2.虚拟代理:根据需要提供一种“惰性初始化”方式来创建高代价的对象。
3.保护代理:当不愿意别人拥有被代理对象的全部访问权时,使用保护代理
4.巧妙引用:当访问被代理的对象时,增加额外的活动。比如:引用计数。它以用来追踪被代理的某个特定对象被引用的次数,以实现写入时复制并防治对象起别名。
参考资料:《C++编程思想》
C++设计模式--代理模式(Proxy)相关推荐
- 设计模式-代理模式(Proxy Pattern)
设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...
- 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣
代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...
- js设计模式——代理模式proxy
什么是代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. (可以想象一下明星与经纪人的关系,明星是请求的本体,经纪人就是代理proxy) 如何实现代理模式 代理对象内部含有对本 ...
- 趣谈设计模式 | 代理模式(Proxy):利用代理来控制对象的访问
文章目录 案例:房屋中介 代理模式 代理模式与装饰器模式 代理模式的应用 远程代理 虚拟代理 安全代理 智能引用代理 写时拷贝代理 总结 完整代码与文档 由于代理模式相较于前面的其他设计模式来说更加简 ...
- 人人都会设计模式---代理模式--Proxy
教程大纲 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/1b3b6b003- 本文出自 Tiger ...
- Java24种设计模式(第二种)--代理模式(Proxy Pattern)
Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...
- 二十三种设计模式(第十二种)-----代理模式(Proxy)
二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...
- Android常见设计模式——代理模式(Proxy Pattern)(二)
文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...
最新文章
- opcache php 原理_php之Opcache
- 2021/6/20~22 每天学习python 30分钟 -了解python - python的运算符
- 中国固废处理行业十四五建议规划与前景深度研究报告2022-2028年
- open-capacity-platform 项目启动
- GDCM:DICOM文件转换为QImage文件的测试程序
- Vue踩坑之旅(四)—— 自定义指令实现滚动加载
- c#将http调用返回额json中的有关中文的unicode转换为中文
- Js 获取当前页面的高度
- 一文带你全面了解java对象的序列化和反序列化
- python中np.reshape与matlab中reshape区别,以及多axis的np.mean分析[探索6]
- python获取请求中的参数_python – 在Tastypie中获取请求参数
- 金蝶ERP实现产品入库及委外加工冲减生产现场虚仓毛坯数(修正版07-05-10)
- ICG博弈_威佐夫博弈(Wythoff Game)及证明
- GIS中坐标系的基本概念
- Linux 网络驱动
- android 工具类toast,Android Toast工具类
- 但行好事 莫问前程 学习笔记 media=screen
- unity接入百度人体识别
- Apache Kylin踩坑记
- echarts图标数据较多文字较长缩放重叠问题的配置
热门文章
- Jquery 单击_双击_鼠标经过_鼠标离开_背景样式变化
- String和Date、Timestamp之间的转换
- hdu 1003 A + B Problem II 使用整型数组轻松实现大数求和
- secureCRT配置ssh -x
- 中小型企业纯开源免费工具的解决方案
- Windows NT体系结构
- sklearn:auc、roc_curve、roc_auc_score
- 推荐 12 个学习前端必备的神仙级工具类项目与网站
- OCR 深度学习 综述
- 通过实战跑分来展示HBase2.x的写入性能