设计模式04:代理模式
系列总链接:https://blog.csdn.net/qq_22122811/article/details/112360387
参考:
https://www.cnblogs.com/daniels/p/8242592.html
https://www.runoob.com/design-pattern/proxy-pattern.html
https://blog.csdn.net/a369189453/article/details/81275740
一:概述
代理模式(proxy pattern):为其他对象提供一种代理以控制这个对象的访问;
理解:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。
引入装饰模式的原因 :
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
二:结构与实现
结构图:
介绍:
三:应用
在《大话设计模式》-装饰模式,这一章中,作者用了戴励(代理)帮助卓贾易追到娇娇,如下图:
书中的例子不赘述,这里用了网上找的另外一个例子 =》 中介代替小明去完成租房的工作,代码如下:
/********************************************** 代理模式 2021-01-27
**********************************************/
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>// Subject,人和中介的接口类
class Person
{
public:virtual void rentHouse() = 0;
};// realSubject, 小明是真实买房的人,继承于人
class XiaoM : public Person
{
public:void rentHouse(){qDebug() << "我要租房";};
};// Proxy, 中介代理小明买房子,这里不能理解为继承,因为关系是like_a, 还不是is_a
class Intermediary : public XiaoM
{
public:Intermediary(){}void rentHouse() override{if(m_person == NULL){m_person = new XiaoM(); // 创建被代理对象,即实际是被代理对象进行操作}m_person->rentHouse();};
private: // 需要设置为私有的,因为这里是一级代理,也是最后一级代理,所以是privateXiaoM* m_person;
};// 真实场景
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));Intermediary* interRy = new Intermediary();// 代理类帮实际对象完成操作interRy->rentHouse();return a.exec();
}
四:优缺点及适用环境
4.1:优缺点
优点:
职责清晰:真实角色就是实现实际的业务逻辑,不关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简介清晰。
高扩展性:具体主题角色可变。
缺点:
这种模式引入了另一个抽象层,这有时可能是一个问题。如果真实主题被某些客户端直接访问,并且其中一些客户端可能访问代理类,这可能会导致不同的行为。
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
4.2:适用场景
使用场景:
想在访问一个类时做一些控制。
应用例子:
1、Windows 里面的快捷方式。
2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
3、买火车票不一定在火车站买,也可以去代售点。
4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
书中说到的如下:
4.3:注意事项
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
五:小结
代理模式实际上就是为了代理其他对象控制对这个的访问,如现实生活中的中介代理我们去租房子,外卖小哥代理我们去取外卖等等,这个符合设计原则中的扩展开放,修改关闭的原则。
设计模式04:代理模式相关推荐
- 大话设计模式——04代理模式
一.代人送礼 送人礼物不好意思怎么办?找人代送呗! 二.不使用代理的代码 // 追求类 // 即RealSubject类,定义Proxy所代表的真实实体 public class Woo implem ...
- 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )
文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...
- C++设计模式之代理模式
这篇文章主要介绍了C++设计模式之代理模式,本文讲解了什么是代理模式.代理模式的使用场合.代理模式的实现代码等内容,需要的朋友可以参考下 前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就 ...
- python中代理模式分为几种_Python设计模式之代理模式实例详解
本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...
- 设计模式笔记——代理模式
设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...
- 「设计模式(五) - 代理模式」
「设计模式(五) - 代理模式」 一.处处可见的"代理" "代理"在平常生活司空见惯,点外卖,租房子找中介,买飞机票等等.基本上用手机就能完成,也就是不直接接触 ...
- Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程
Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍 随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...
- 设计模式之一代理模式
代理模式(代理设计模式) 代理模式的定义与特点 代理模式的结构与实现 代理模式(代理设计模式) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代 ...
- 23种设计模式7_代理模式之一静态代理
23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...
- Java中的设计模式:“代理模式”的理解
代理模式定义: 为其他对象提供一种代理以控制对这个对象的访问.在面向对象中,有时候直接访问一些对象比较麻烦,所以代理模式就是在这个对象上加上一个访问该对象的访问层.类似于很多明星的事务实际都是交给经纪 ...
最新文章
- Eclipse 小插件
- 东北大学 | 一种适用于大规模公路环境的鲁棒激光惯性里程计和建图系统
- C# 控件置于最顶层、最底层
- CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
- 单片机断电后不保存程序_51单片机运行过程
- 【学习笔记】Python - Lxml
- Delphi中的TreeView
- VTK:图表之CreateTree
- homebrew install php53
- Java 按位运算符(,|,^,,)
- Git学习总结(15)——解决Win10 Git图标不显示问题
- css3 animation
- 用正则表达式将前后空格用空字符串替代:replace(/(^\s*)|(\s*$)/g, )
- pytorch visdom可视化工具学习—1—详细使用-3-Generic Plots和Others
- VGG11、VGG13、VGG16、VGG19网络结构图
- BS7799信息安全管理体系介绍(转载)
- proteus——采用 LM317 的稳压电源
- 用3DMAX制作《滚动的小球》
- 470万条12306用户信息遭泄露
- Android系统 linux内核按键驱动开发