【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


代理模式


代理模式,也叫委托模式

Spring AOP 是基于动态代理来实现 AOP 的


定义


  • 其他对象提供一种代理 以控制对这个对象的访问
  • 它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端目标对象之间起到中介的作用。


使用代理前:

image-20250420174514464


使用代理后:

image-20250420174527254


代理模式角色


角色名称描述房屋租赁中的对应角色
Subject业务接口类
可以是抽象类或者接口(不一定有)。
定义了业务操作的接口。
房屋租赁的通用操作(如出租房屋)
RealSubject业务实现类
具体的业务执行,也就是被代理对象
房东
Proxy代理类
RealSubject 的代理
代理对象内部含有对 RealSubject 的引用,并实现 Subject 接口
中介

UML 类图如下:

image-20250420174647181

简单总结一下:

  • 首先,Subject 是一个接口或者抽象类,定义了 RealSubjectProxy共同方法
  • RealSubject 实际执行任务的对象,而 Proxy控制对 RealSubject 的访问

两种代理模式的区别


代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加增强


根据代理创建时期代理模式分为静态代理动态代理静态代理是在编译时确定代理关系,而动态代理是在运行时动态生成的


  • 静态代理:
    • 由程序员创建代理类特定工具自动生成源代码再对其编译
    • 程序运行前代理类 .class 文件就已经存在了。

  • 动态代理:
    • 在程序运行时,运用反射机制动态创建而成。

静态代理


静态代理:在程序运行前,代理类的 .class 文件就已经存在了。

在出租房子之前,中介已经做好了相关的工作,就等租户来租房子了;

我们通过代码来加深理解。以房租租赁为例:


定义接口(定义房东要做的事情,也是中介需要做的事情):

image-20250421215536731


实现接口(房东出租房子):

image-20250421215735024


代理(中介,帮房东出租房子):

image-20250421215904847


  1. RealSubject 实际执行任务的对象,而 Proxy控制对 RealSubject 的访问
  2. 代理对象内部含有对 RealSubject 的引用,并实现 Subject 接口

所以中介类中,应该有房东,因为只有房东授权,中介才能带中介看房子

image-20250421220159344


中介的 saleHouse() 调用房东的 saleHouse(),表示真正卖房的人是房东:

image-20250421220446801

本质是房东的 saleHouse() 借助中介的 saleHouse() 套了一层壳:


租客来看房了,房租对中介进行授权,让中介有带租客看房子的权力:

image-20250421220923557


我们在拆的细一点:

image-20250421221523649


上面的代码逻辑是,房东需要出租一个房子 target 给租客,房东先把房子 target 这个任务给中介;


但是上面的代码还是不够好,因为租房子应该使用接口的方法:

image-20250421222757349


修改:

image-20250421223159655


image-20250421223737493


运行结果:

image-20250421224314645


image-20250421224245055


租客 中介(Proxy) 房东(RealSubject) 我要租房 检查租客资质 转发租房请求 确认可出租 签订代理合同 交付钥匙 租客 中介(Proxy) 房东(RealSubject)

上面这个代理实现方式就是静态代理(仿佛啥也没干)

从上述程序可以看出,虽然静态代理完成了对目标对象的代理,但是由于代码都写死了对目标对象的每个方法的增强都是手动完成的,非常不灵活。所以日常开发几乎看不到静态代理的场景。


接下来新增需求:中介又新增了其他业务:代理房屋出售。

我们需要对上述代码进行修改:


  1. 接口定义修改。

image-20250421224636230


  1. 接口实现修改。

image-20250421224525655


  1. 代理类修改。

image-20250421224621059


从上述代码可以看出,我们修改接口(Subject)业务实现类(RealSubject)时,还需要修改代理(Proxy)

同样的,如果有新增接口(Subject)业务实现类(RealSubject),也需要对每一个业务实现类新增代理类(Proxy)

既然代理的流程是一样的,有没有一种办法,让他们通过一个代理类来实现呢? 这就需要用到动态代理技术了。


动态代理


相比于静态代理来说,动态代理更加灵活

我们不需要针对每个目标对象单独创建一个代理对象,而是把这个创建代理对象的工作推迟到程序运行时由 JVM 来实现。也就是说动态代理在程序运行时,根据需要动态创建生成。

比如房屋中介,我不需要提前预测都有哪些业务,而是业务来了我再根据情况创建。


Java 也对动态代理进行了实现,并给我们提供了一些 API,常见的实现方式有两种:

  1. JDK 动态代理。
  2. CGLIB 动态代理。

动态代理在我们日常开发中使用的相对较少,但是在框架中几乎是必用的一门技术。

学会了动态代理之后,对于我们理解和学习各种框架的原理也非常有帮助:

https://xiaolllei.blog.csdn.net/article/details/147427226?spm=1011.2415.3001.5331


在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用java语言,怎样开发和利用各种开源库和内部/自定义框架,实现“提取-转换-加载”(ETL)流程的自动化

一、ETL 架构设计的核心要素​ 在企业级数据处理场景中,ETL(Extract-Transform-Load)流程自动化是数据仓库、数据湖建设的核心环节。基于 Java 生态的技术栈,我们可以构建分层解耦的 ETL 架构,主要包含以下四层结构&am…

2023蓝帽杯初赛内存取证-8

也是用到pslist模块,加上grep过滤”chrome“即可: vol.py --plugin/opt/volatility/plugins -f memdump.mem --profile Win7SP1x64 pslist | grep "chrome" 第一个是PID,第二个是PPID,第三个是线程数,第四个…

【C语言】动态内存的常见错误

前言&#xff1a; 在上章节中讲解了动态内存的概念和管理的核心函数。 在本章节继续为大家介绍动态内存的常见错误&#xff0c;让大家更好的理解运用。 补充&#xff1a;使用内存函数需要头文件<stdlib.h> 对NULL指针的解引用操作 当使用malloc、calloc或realloc等函…

uniapp-x 二维码生成

支持X&#xff0c;二维码生成&#xff0c;支持微信小程序&#xff0c;android&#xff0c;ios&#xff0c;网页 - DCloud 插件市场 免费的单纯用爱发电的

Linux内核之文件驱动随笔

前言 近期需要实现linux系统文件防护功能&#xff0c;故此调研了些许知识&#xff0c;如何实现文件防护功能从而实现针对文件目录防护功能。当被保护的目录&#xff0c;禁止增删改操作。通过内核层面实现相关功能&#xff0c;另外在通过跟应用层面交互从而实现具体的业务功能。…

利用大模型实现地理领域文档中英文自动化翻译

一、 背景描述 在跨国性企业日常经营过程中&#xff0c;经常会遇到专业性较强的文档翻译的需求&#xff0c;例如法律文书、商务合同、技术文档等&#xff1b;以往遇到此类场景&#xff0c;企业内部往往需要指派专人投入数小时甚至数天来整理和翻译&#xff0c;效率低下&#x…

鸿蒙Flutter仓库停止更新?

停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道&#xff0c;Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了&#xff0c; Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供&#xff0c;最近有小伙伴反馈已经 2 个多月没有停止更新了&#xff0c;不少人以为停…

(七)深入了解AVFoundation-采集:采集系统架构与 AVCaptureSession 全面梳理

引言 在 iOS 开发中&#xff0c;AVFoundation 是构建音视频功能的强大底层框架。而在音视频功能中&#xff0c;“采集”往往是最基础也是最关键的一环。从摄像头捕捉图形、到麦克风获取声音&#xff0c;构建一条高效且稳定的采集链是开发高质量音视频应用的前提。 本系列将逐…

QML ShaderEffect(着色器效果)组件

ShaderEffect 是 QML 中用于实现自定义着色器效果的组件&#xff0c;允许开发者使用 GLSL 着色器语言创建图形效果。 核心属性 基本属性 属性类型默认值说明fragmentShaderstring""片段着色器代码vertexShaderstring""顶点着色器代码blendingbooltrue是…

基于javaweb的SSM教材征订与发放管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

大模型学习笔记------Llama 3模型架构之分组查询注意力(GQA)

大模型学习笔记------Llama 3模型架构之分组查询注意力&#xff08;GQA&#xff09; 1、分组查询注意力&#xff08;GQA&#xff09;的动机2、 多头注意力&#xff08;Multi-Head Attention, MHA&#xff09;3、 多查询注意力 (Multi-Query Attention&#xff0c;MQA)4、 分组查…

matlab 环形单层柱状图

matlab 环形单层柱状图 matlab 环形单层柱状图 matlab 环形单层柱状图 图片 图片 【图片来源粉丝】 我给他的思路是&#xff1a;直接使用风玫瑰图可以画出。 rose_bar 本次我的更新和这个有些不同&#xff01;是环形柱状图&#xff0c;可调节细节多&#xff1b; 只需要函数…

Docker--Docker网络原理

虚拟网卡 虚拟网卡&#xff08;Virtual Network Interface&#xff0c;简称vNIC&#xff09; 是一种在软件层面模拟的网卡设备&#xff0c;不依赖于物理硬件&#xff0c;而是通过操作系统或虚拟化技术实现网络通信功能。它允许计算机在虚拟环境中模拟物理网卡的行为&#xff0…

linux基础14--dns和web+dns

DNS&#xff1a;域名系统&#xff08;Domain Name System&#xff09; DNS协议是用来将域名转换为IP地址或将IP地址转换为相应的域名 DNS使用TCP和UDP端口53&#xff0c;给用户提供解析时一般使用UDP53 对于每一级域名长度的限制是63个字符&#xff0c;域名总长度则不能超过2…

C++抽象基类定义与使用

在 C 中&#xff0c;抽象基类&#xff08;Abstract Base Class, ABC&#xff09; 是一种特殊的类&#xff0c;用于定义接口规范和约束派生类的行为。它通过纯虚函数&#xff08;Pure Virtual Function&#xff09;强制要求派生类实现特定功能&#xff0c;自身不能被实例化。以下…

用selenium4 webdriver + java 搭建并完成第一个自动化测试脚本

自动化测试任务&#xff1a; 百度搜索自己的姓名。点击第一个链接&#xff08;或者第二个&#xff09;&#xff0c;在新的页面上&#xff0c;添加断言&#xff0c;验证你的名字是否存在。 实验资料百度网盘下载路径&#xff1a; 链接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基础数学工具—— 约束优化

Q26: 推导拉格朗日乘子法 的 KKT 条件 拉格朗日乘子法与 KKT 条件是啥&#xff1f; 拉格朗日乘子法是解决约束优化问题的利器。比如&#xff0c;想最小化函数 &#xff0c;同时满足约束 &#xff0c;就构造拉格朗日函数 &#xff08; 是乘子&#xff09;。KKT 条件是解这类问…

net+MySQL中小民营企业安全生产管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;中小民营企业安全生产管理系统利用计算机网络实现信息化管理&#xff0c;使企业的中小民营企业安全生产管理发展和服务水平有显…

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型语言模型中的人工智能安全性:一项调查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL数据库】表的约束

目录 1&#xff0c;空属性 2&#xff0c;默认值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主键primary key 6&#xff0c;自增长auto_increment 7&#xff0c;唯一键unique 8&#xff0c;外键foreign key 在MySQL中&#xff0c;表的约束是指用于插入的…