当前位置: 首页 > news >正文

设计模式12、代理模式 Proxy

解释说明:代理模式(Proxy Pattern)为其他对象提供了一种代理,以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
抽象主题(Subject):通过接口或抽象类声明真实主题和代理对象事项的业务方法
真实主题(RealSubject):实现了抽象主题中额具体业务,是代理对象所代表的真实对象,是最终要引用的对象
代理(Proxy):提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能
优点:
代理模式能将代理对象与真正被调用的对象分离,在一定程度上降低了系统的耦合度。
在客户端和目标对象之间,代理起到一个中介作用,这样可以保护目标对象。在对目标对象调用之前,代理对象也可以进行其他操作。
缺点:
这种模式引入了另一个抽象层,这有时可能是一个问题。如果真实主题被某些客户端直接访问,并且其中一些客户端可能访问代理类,这可能会导致不同的行为。
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂
适用场景
根据目的和实现方式的不同,代理模式可分为很多种,常见的有:
远程代理(Remote Proxy)
为一个位于不同地址空间的对象提供一个本地代理,对代理的方法调用会导致对远程对象的方法调用。ATM 就是一个例子,ATM 可能会持有(存在于远程服务器中的)银行信息的一个代理对象。
虚拟代理(Virtual Proxy)
使用虚拟代理,代理可以作为一个(资源消耗较大的)对象的代表。虚拟代理经常延迟对象的创建,直到需要为止。在创建对象之前(及创建对象过程中),虚拟代理也可以作为对象的代理;之后,代理将请求直接委托给 RealSubject。
保护代理(Protection Proxy)
根据访问权限,可以使用保护代理来控制对资源的访问。例如,有一个员工对象,保护代理可以允许普通员工调用对象的某些方法,管理员调用其他方法。
缓冲代理(Cache Proxy)
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
智能引用代理(Smart Reference Proxy)
当一个对象被引用时,提供一些额外的操作(例如:将对象被调用的次数记录下来)。
#pragma once
#include <iostream>
// 电信运营商
class ITelco
{
public:virtual ~ITelco() {}virtual void Recharge(int money) = 0;  // 充值
};
// 中国移动
class CMCC : public ITelco
{
public:void Recharge(int money) override {std::cout << "Recharge " << money;}
};
// 代理点
class Proxy : public ITelco
{
public:Proxy() : m_pCMCC(NULL) {}~Proxy() { delete m_pCMCC; }// 低于 50 不充void Recharge(int money) override {if (money >= 50) {if (m_pCMCC == NULL)m_pCMCC = new CMCC();m_pCMCC->Recharge(money);}else {std::cout << "Sorry, too little money" << std::endl;}}
private:CMCC* m_pCMCC;
};#include "subject.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{Proxy* proxy = new Proxy();proxy->Recharge(20);proxy->Recharge(100);SAFE_DELETE(proxy);getchar();return 0;
}

 

http://www.lryc.cn/news/182513.html

相关文章:

  • ZXing - barcode scanning library for Java, Android
  • MySQL存储引擎:选择合适的引擎优化数据库性能
  • 用向量数据库Milvus Cloud 搭建AI聊天机器人
  • 深入理解JVM虚拟机第十一篇:详细介绍JVM中运行时数据区
  • mysql面试题17:MySQL引擎InnoDB与MyISAM的区别
  • 第2篇 机器学习基础 —(1)机器学习方式及分类、回归
  • uniapp echarts 适配H5与微信小程序
  • 第46节——redux中使用不可变数据+封装immer中间件——了解
  • 《数字图像处理-OpenCV/Python》连载(10)图像属性与数据类型
  • sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第三周测验
  • LLMs 用强化学习进行微调 RLHF: Fine-tuning with reinforcement learning
  • iMazing 2.17.10官方中文版含2023最新激活许可证码
  • 如何在windows系统环境下使用tail命令查看日志
  • 设计模式——访问者模式
  • 一文读懂UTF-8的编码规则
  • 二叉树题目:路径总和 II
  • Qt model/view 理解01
  • c与c++中的字符串
  • Android 获取IP地址的Ping值 NetworkPingUtils
  • 数据集笔记:OpenCelliD(手机基站开放数据库)
  • Windows电脑多开器的使用心得分享
  • Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)
  • 虚拟机通过nat模式端口映射实现内网穿透
  • 计算机网络(六):应用层
  • Sublime Text 4 for Mac激活下载
  • 存在负权边的单源最短路径的原理和C++实现
  • 15-自动化测试——理论知识
  • 学信息系统项目管理师第4版系列17_干系人管理
  • 专业PDF编辑阅读工具PDF Expert mac中文特点介绍
  • 处理机调度的概念,层次联系以及七状态模型