设计模式:代理模式(Proxy)

代理(Proxy)模式 文章目录代理(Proxy)模式1. 意图2. 别名3 动机4. 适用性5. 结构6. 参与者7. 协作8. 效果9. 实现10. 代码示例11. 已知应用12. 相关模式13. Q&A14. 设计原则口袋15. 参考文献 代理(Proxy)模式 隶属类别——对象结构型模式 1. 意图 对其他对象提供一种代理以控制对这个对象的访问。 2. 别名 Surrogate(谷歌翻译结果有点尴尬。)... 阅读详情

设计模式:代理模式(Proxy)

代理模式(Proxy)属于结构型模式(Structural Pattern)的一种。

结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。

结构型模式可以分为类结构型模式和对象结构型模式:

  • 类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。
  • 对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。

模式动机

在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。

模式定义

代理模式(Proxy)属于对象结构型模式。

代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

模式结构

代理模式(Proxy)包含如下角色:

  • 抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样在任何使用真实主题的地方都可以使用代理主题。
  • 真实主题(Real Subject):实现了抽象主题接口,是代理对象所代表的真实对象。客户端直接访问真实主题,但在某些情况下,可以通过代理主题来间接访问。
  • 代理(Proxy):实现了抽象主题接口,并持有对真实主题的引用。代理主题通常在真实主题的基础上提供一些额外的功能,例如延迟加载、权限控制、日志记录等。
  • 客户端(Client):使用抽象主题接口来操作真实主题或代理主题,不需要知道具体是哪一个实现类。

在这里插入图片描述

时序图

在这里插入图片描述

模式实现

抽象主题 Subject.h:

#ifndef _SUBJECT_H_
#define _SUBJECT_H_

class Subject
{
public:
	virtual void request() = 0;
};

#endif // !_SUBJECT_H_

真实主题 RealSubject.h:

#ifndef _REAL_SUBJECT_H_
#define _REAL_SUBJECT_H_

#include <iostream>

#include "Subject.h"

class RealSubject : public Subject
{
public:
	virtual void request()
	{
		std::cout << "RealSubject::request" << std::endl;
	}
};

#endif // !_REAL_SUBJECT_H_

代理 Proxy.h:

#ifndef _PROXY_H_
#define _PROXY_H_

#include <iostream>

#include "Subject.h"
#include "RealSubject.h"

class Proxy : public Subject
{
private:
	RealSubject* m_pRealSubject;

	void preRequest()
	{
		std::cout << "Proxy::preRequest" << std::endl;
	}
	void afterRequest()
	{
		std::cout << "Proxy::afterRequest" << std::endl;
	}

public:
	Proxy()
	{
		m_pRealSubject = new RealSubject();
	}
	virtual ~Proxy()
	{
		delete m_pRealSubject;
	}

	virtual void request()
	{
		preRequest();
		m_pRealSubject->request();
		afterRequest();
	}
};

#endif // !_PROXY_H_

在单线程环境下的测试

测试代码,也可以说是 client:

#include <stdlib.h>

#include "RealSubject.h"
#include "Proxy.h"

using namespace std;

int main()
{
	Proxy* proxy = new Proxy();
	RealSubject* realSubject = new RealSubject();

	proxy->request();
	cout << endl;
	realSubject->request();

	delete proxy;
	delete realSubject;

	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

在多线程环境下的测试

略。

模式分析

  • 代理模式可以在不改变原始对象接口的情况下,增加额外的逻辑或控制,比如限制某些客户端的访问权限。
  • 代理模式还常⽤在访问真实对象之前或之后执⾏⼀些额外的操作(⽐如记录⽇志),对功能进⾏扩展。

优缺点

优点:

  1. 代理模式可以隐藏真是对象的实现细节,使客户端无需知晓真实对象的工作方式和结构。
  2. 通过代理类来间接访问真实类,可以在不修改真实类的情况下,对其进行扩展、优化或添加安全措施。
  3. 代理模式实现起来简单,易于扩展和维护,符合面向对象设计原则中的开闭原则。

缺点:

  1. 代理模式可能会引入额外的复杂性和间接性,增加程序设计和维护的难度。
  2. 对象代理可能会降低系统性能,特别是在处理大数据量或频繁调用的情况下,因为代理需要额外的计算和网络通信开销。

适用场景

按职责来划分,通常有以下适用场景:

  1. 远程代理: 当一个对象位于不同的地址空间时,代理模式可以提供一个局域代表对象。这在分布式系统中尤其有用,例如,一个客户端可能需要通过代理访问位于远程服务器上的对象。
  2. 虚拟代理: 当创建一个资源消耗很大或者创建过程复杂的对象时,可以使用虚拟代理来延迟对象的创建和初始化,只有在需要时才真正创建并初始化对象。
  3. Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
  4. 保护/安全代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
  5. 缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  6. 防火墙(Firewall)代理:保护目标不让恶意用户接近。
  7. 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
  8. 智能引用: 智能引用代理可以在调用真实对象的方法时,处理额外的逻辑。例如,代理可以在调用前后添加日志记录、性能监控等。
  9. 外部接口代理: 当使用外部提供的接口(如 STL 或动态库 API 函数)时,由于这些接口可能会发生改变,直接使用可能导致项目与接口函数之间的耦合度很高。通过使用代理模式,可以在项目中用一个类封装这个外部接口,将耦合控制在这个类中,并管理外部接口函数的所有功能。这样,当外部接口函数有变化时,只需要修改代理类中的耦合部分,而无需在整个项目中寻找和修改。

应用场景

  1. AOP:通过定义切面、切入点和通知等,Spring AOP在运行时生成代理对象,将切面逻辑织入到目标对象的方法调用中。代理对象在方法调用前后执行附加操作,如日志记录、性能监控等。
  2. 动态代理(JDK动态代理、CGLIB代理):当Bean类实现了接口时,Spring使用JDK动态代理来为Bean生成代理对象;当Bean类没有实现接口时,Spring使用CGLIB代理来生成代理对象。
  3. Android中的Glide框架使⽤了代理模式来实现图⽚的延迟加载。

代理模式和适配器模式的区别

代理模式的主要⽬的是控制对对象的访问。通常⽤于在访问真实对象时引入⼀些额外的控制逻辑,如权限控制、延迟加载等。

适配器模式的主要目的是使接口不兼容的对象能够协同⼯作。适配器模式允许将⼀个类的接口转换成另⼀个类的接口,使得不同接⼝的类可以协同工作。

代理模式装饰器模式的区别

装饰器模式是为了增强功能,而代理模式是为了加以控制。

模式扩展

在传统的代理模式中,客户端通过Proxy调用RealSubject类的request()方法,同时还在代理类中封装了其他方法(如preRequest()和postRequest()),可以处理一些其他问题。

如果按照这种方法使用代理模式,那么真实主题角色必须是事先已经存在的,并将其作为代理对象的内部成员属性。如果一个真实主题角色必须对应一个代理主题角色,这将导致系统中的类个数急剧增加,因此需要想办法减少系统中类的个数,此外,如何在事先不知道真实主题角色的情况下使用代理主题角色,这都是动态代理需要解决的问题。

动态代理是在程序运行时动态生成代理类,也就是说我们在编写代码时并不知道具体代理的是什么类,而是在程序运行时动态生成。

动态代理的典型应用就是Spring AOP。

参考

  1. https://design-patterns.readthedocs.io/zh-cn/latest/structural_patterns/proxy.html
  2. https://www.runoob.com/design-pattern/proxy-pattern.html
  3. https://blog.youkuaiyun.com/weixin_45433817/article/details/131037102
  4. https://www.cnblogs.com/chengmf/p/16035640.html
  5. https://blog.youkuaiyun.com/K1_uestc/article/details/135505787
  6. https://blog.youkuaiyun.com/weixin_45433817/article/details/130975792
  7. https://blog.youkuaiyun.com/h8062651/article/details/136523839
本地AI语音生成与配音工作台Pandrator:从TTS到RVC的完整实践指南 语音合成(TTS)技术通过深度学习模型将文本转换为自然语音,其核心原理涉及声学建模与波形生成。这项技术不仅提升了人机交互体验,更在内容创作领域展现出巨大价值,广泛应用于有声书制作、视频配音、虚拟助手等场景。本文聚焦于一个集成了XTTS-v2、RVC等先进模型的本地化AI语音工作台——Pandrator,它通过模块化架构将语音合成、声音克隆、音频转录与翻译等流程无缝整合,为用户提供了一个图形化、可定制的完整解决方案。文章深入解析了其基于TTS与RVC(Retrieval-based Voice Convers 阅读详情

相关推荐

DDSP(Differentiable Digital Signal Processing) 开篇

文章目录DDSP可以用来做什么?下一步工作 工作中接触到了DDSP声码器,但非科班出声的我对这块知识非常陌生,甚至带有一些畏惧的心理,但是为了工作为了进步,必须硬下头皮去啃,相信只要耐心地坚持,没什么能难到我。于是从今天开始,就用这个博客专栏来记录我的学习历程,希望也能帮助到你~ DDSP对应的论文是:DDSP: Differentiable Digital Signal Processing 先翻译一篇来自DDSP论文作者的对DDSP的介绍的文章。 今天,我们很高兴地介绍可微数字信号处理(DDSP)库。

YeeKo的博客 9246

代理模式(Proxy模式)详解

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。 在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真...

傅红雪的专栏 2万+

Mumax3高效模拟技巧:如何利用代码模板快速完成磁性材料特性分析

本文介绍了利用Mumax3代码模板库提升磁性材料微磁学模拟效率的核心方法。通过构建模块化的环境配置、材料库和特征长度计算模板,研究者可以快速组装模拟方案,自动化参数扫描与结果分析,从而将精力聚焦于物理问题本身,实现工作效率的指数级提升。

zz67890的博客 550

设计模式第4讲——代理模式(Proxy)

代理模式属于结构型设计模式。一、什么是代理模式二、分类 三、特点 四、应用场景4.1 生活场景4.2 Java场景 五、代码实现5.0 代码结构5.1 静态代理5.2 JDK动态代理5.3 Cglib代理 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 8978

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5912

OPCUA二(通过OPCUA服务器访问CPU)

摘要:本文介绍了使用UaExpert软件连接西门子PLC的OPC UA配置方法,包括IP地址设置(默认端口4840)、安全认证和证书信任流程。详细说明了数据访问操作,如变量拖拽监控和属性解读(NodeId、Value、状态码等)。特别强调连接仿真Advance7时需先启动实例。最后预告下章将讲解通过KerServer访问CPU。文章涵盖配置步骤、常见问题处理及实用技巧,适合工业自动化开发者参考。

欢迎来到RaymondLeigh的知识共享基地 1337

【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解代理模式的思想,介绍其常见的应用场景,举例说明其实现方式

我只管埋头前行,剩下的交给时间。 3063

Android逆向实战:用Xposed Hook微信消息发送(附完整代码)

本文提供了一份Android逆向实战指南,详细讲解如何使用Xposed框架Hook微信消息发送功能。内容涵盖环境搭建、逆向分析定位关键方法、编写Hook模块代码以及调试部署的全过程,并附有完整代码示例,帮助开发者深入理解Android应用底层交互与Hook技术。

weixin_29196315的博客 1118

设计模式--代理模式(Proxy Pattern)

代理模式(Proxy Pattern) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。 在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。...

吴声子夜歌的博客 1138

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

YOLOv11结合OpenCV技术,精准识别和计数鸡蛋与鸡,广泛应用于养殖场、市场监控和自动化包装。通过深度学习与计算机视觉,提升农业生产效率,让智能化管理更简单高效。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 1205

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1883

设计模式:代理模式 Proxy

代理模式的概念 为其他对象提供一种代理以控制这个对象的访问 --《设计模式:可复用面向对象软件基础》 其中心思想就是控制对象的访问 举一个很简单的例子: 明星与经纪人的关系 明星是目标对象 经纪人是代理对象 当有人想去找明星做他们品牌的代言人的时候,我们是无法直接去联系明星的。只能去联系他的代理人 ,由他的经纪人去转达到明星,明星只需要去做代言人即可,其他一些前后合同交给经纪人来处理即可...

来杯Java 7528

别再用LabelImg了!我手搓了一个C#“一站式”YOLO工具箱,标注训练推理全搞定

这个工具箱目前已经在两个小型产线项目中试用,反馈非常好。效率提升:原本需要 2 天完成的“数据准备 - 训练 - 验证”循环,现在缩短到了 2 小时。门槛降低:产线技术员经过 10 分钟培训,就能独立完成新产品的模型迭代。当然,它还有改进空间未来计划集成主动学习功能:自动筛选出置信度低的图片,推荐优先标注。支持多模型管理:方便在不同产品型号间快速切换。增加PLC 通信模块:直接在推理界面配置 IO 信号,实现真正的软硬联动。最后想说工具的本质是服务于人。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 442

设计模式教程:代理模式(Proxy Pattern)

为其他对象提供一种代理以控制对该对象的访问。常见的代理类型有远程代理、虚拟代理和保护代理等。

遇见伯灵说的博客 1608

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java:设计模式之代理模式Proxy

<!-- table.sample {border-width:1px; border-spacing:0px; border-style:solid; border-color:#78C0D4; border-collapse:collapse} table.sample th {border-width:1px; padding:3px; border-st

混迹于移动互联网和手机行业 1174

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式:代理模式(Proxy Pattern)

代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。

TechNomad的博客 1025

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java设计模式:Proxy代理模式

public interface Sourceable { void method(); } public class Source implements Sourceable{ @Override public void method() { System.out.println("Source method"); } } public class Proxy...

Zhang Phil 677

慢啃设计模式:代理模式Proxy

代理模式也是生活中比较常见的一种模式,比如,现在火车站在城市中各处都会设置代售点,这就是一种代理模式。 代理模式的组成 代理模式由三种角色构成: 抽象角色。通过接口或抽象类声明真实角色实现的业务方法。所谓抽象角色,实际上就是定义真实中角色所能完成的动作,但不做具体实现。 真实角色。实现抽象角色,实现真实角色所要实现的业务逻辑,供代理角色调用。真实角色需要实现

码农的世界 631

设计模式:代理模式(proxy)

接口的应用:代理模式 代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问。 public class ProxyTest { public static void main(String[] args) { Server server = new Server(); ProxyServer proxyServer = new ProxyServer(server); proxyServer.brow

AmorFati1996的博客 255

设计模式:代理模式(Proxy)

代理模式(Proxy) 1.代理模式的基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。 代理模式示意图 2.静态代理 2.1

weixin_43967582的博客 227

设计模式:代理模式(Proxy)

设计模式:代理模式(Proxy) 在我们实际生活中代理情况无处不在!你在淘宝上面买东西,你使用支付宝平台支付,卖家请物流公司发货、你请朋友帮你拿包裹,在这个过程汇总支付宝、物流公司、你朋友都扮演者“第三者”的角色在帮你完成物品的购买,这里的...

108

Java 设计模式:代理模式Proxy

Java设计模式之:代理模式Proxy或Surrogate  代理模式的英文叫做Proxy或Surrogate,所谓代理,就是一个人或者一个机构代表一个机构采取行动。在一些情况下,一个客户不想活着不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起起到中介作用。代理的例子:Windows系统提供的快捷方法,可以使任何对象同时出现多个地方,而不必修改原对象。对快捷方式

9818

设计模式: Proxy 代理模式

设计模式: Proxy 代理模式 文章目录设计模式: Proxy 代理模式简介参考完整示例代码正文场景模式结构代码示例Subject 操作接口Real Subject 操作实体Proxy Subject 操作代理测试代码结语 简介 目的 创建型 结构型 行为型 类 Factory Method 工厂方法 Adapter 适配器 Interpreter 解释器Template Method 模版方法 对象 Abstract Factory 抽象工厂Builder 生成器Prototype

超悠閒的博客 261
上一篇: VTK 数据处理:特征边提取
下一篇: 设计模式:适配器模式(Adapter)
UestcXiye
博客等级 码龄8年 9029粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值