java设计模式(六)代理模式(Proxy Pattern)

1、模式介绍:

代理模式(Proxy Pattern)是一种结构型设计模式,它允许你在不改变客户端代码的情况下,向某个对象提供一个代理,以控制对该对象的访问。代理对象通常会在实际对象的方法调用前后添加一些附加逻辑,如权限控制、懒加载、日志记录等。

代理模式涉及以下几个角色:

接口(Subject):定义了代理类和真实类共同的接口。

真实类(RealSubject):实现了接口的具体类,它是真正执行操作的对象。

代理类(Proxy):也实现了接口,持有真实类的引用,并在调用真实类的方法前后进行一些额外的处理。

2、应用场景:

远程代理(Remote Proxy):为一个对象在不同地址空间提供局部代表。典型应用是 RMI(远程方法调用)。

虚拟代理(Virtual Proxy):根据需要创建开销大的对象。它在真正需要时才创建对象。

保护代理(Protection Proxy):控制对原始对象的访问。通常用于对象应该有不同的访问权限。

智能引用(Smart Reference):在访问对象时提供额外的功能,例如引用计数、缓存等。

3、优点:

控制对真实对象的访问,增加系统的灵活性。

可以对真实对象进行扩展,而不修改其代码。

提供了对目标对象额外的操作,如权限控制、延迟加载、日志记录等。

4、缺点:

增加了系统的复杂度,尤其是在使用保护代理时。

可能会影响请求的处理速度,因为增加了间接层。

5、代码实现:

/*** 代理接口** @author FM_南风* @date 2024/6/25 13:28*/
public interface Subject {void request();
}/*** 实体类** @author FM_南风* @date 2024/6/25 13:28*/
public class RealSubject implements Subject{@Overridepublic void request() {System.out.println("实体类的请求");}
}/*** 代理类** @author FM_南风* @date 2024/6/25 13:30*/
public class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.request();postRequest();}private void preRequest() {System.out.println("代理类: 前置处理");}private void postRequest() {System.out.println("代理类: 后置处理");}
}/*** 应用** @author FM_南风* @date 2024/6/25 13:31*/
public class ProxyClient {public static void main(String[] args) {Subject proxy = new Proxy();proxy.request();}
}

6、结果展示:


7、拓展动态代理:

还可以使用动态代理来实现代理模式,它使用 java.lang.reflect.Proxy 类和 InvocationHandler 接口来动态地创建代理对象。动态代理可以在运行时动态地将代理逻辑添加到真实对象中,而不需要在编译时显式地创建代理类。

/*** 动态代理** @author FM_南风* @date 2024/6/25 13:37*/
public class ProxyInvocationHandler implements InvocationHandler {private Object realSubject;public ProxyInvocationHandler(Object realSubject) {this.realSubject = realSubject;}@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {System.out.println("动态代理类: 前置处理");Object result = method.invoke(realSubject, objects);System.out.println("动态代理类: 后置处理");return result;}
}/*** 动态代理应用** @author FM_南风* @date 2024/6/25 13:39*/
public class ProxyInvocationClient {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),new ProxyInvocationHandler(realSubject));proxy.request();}
}

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

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

相关文章

【LeetCode】每日一题:三数之和

解题思路 最开始是打算沿着二数之和的思路做,即固定了最大的,然后小的开始遍历,因为这种遍历方式只需要遍历一轮就能完成,所以复杂度应该是O(n2),但是最后几个示例还是超时了,可能进…

《UDS协议从入门到精通》系列——图解0x35:请求上传

《UDS协议从入门到精通》系列——图解0x35:请求上传 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 三、通信示例 Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快…

解决Java中的NoSuchElementException异常的常见方法

解决Java中的NoSuchElementException异常的常见方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在Java编程中,NoSuchElementException异常是一个…

AMSR-E/Aqua 第 3 级全球地表土壤水分月平均值 V005 (AMSRE_AVRMO)

AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Averages V005 (AMSRE_AVRMO) at GES DISC AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Standard Deviation V005 (AMSRE_STDMO) at GES DISC 简介 GES DISC 的 AMSR-E/Aqua 第 3 级全球地表土壤水…

操作系统入门 -- 内存管理

操作系统入门 – 内存管理 1.内存种类 1.1 虚拟内存(VIRT) 进程需要的虚拟内存大小,包括进程使用的库、代码、数据以及malloc、new分配的堆空间和栈空间等。若进程申请了10MB内存但实际使用了1MB,则物理空间会增长10MB。 1.2 …

Resource punkt not found.的解决方法

这个问题本来不想记录,但是在好几个机子上都碰到了(用到了LangChain读Word文档)。简单记录一下。看到报错以后运行: import nltk # nltk.set_proxy(http://192.168.1.68:10811) nltk.download() 中间这句我注释掉了,…

接轨国际安全标准:等保认证在提升企业全球竞争力中的核心作用

随着全球化进程的加速和数字经济的蓬勃发展,信息安全已成为企业拓展国际市场、参与国际竞争的重要基石。网络安全等级保护(简称“等保”)认证,作为衡量企业信息安全管理水平的重要标尺,不仅体现了企业的技术实力和合规…

速盾:ddos攻击类型有哪些?

DDoS攻击(分布式拒绝服务攻击)是一种通过利用多个被感染的计算机或网络设备,以大量的请求或数据包来占用目标系统资源,导致其无法正常提供服务的攻击方式。DDoS攻击常常被黑客用来影响目标的可用性,造成经济损失或打击…

如何以智能方式安装 Python

Python易于使用,对初学者友好,功能强大,几乎可以为任何应用程序创建强大的软件。 但与任何其他软件一样,Python 的设置和管理可能很复杂。 在本文中,我们将介绍如何正确设置 Python。 您将学习如何选择合适的版本、…

学习笔记——动态路由——RIP(附加度量值配置)

六、附加度量值配置 RIP协议cost开销值:默认值为0,路由信息每传递一次,值增加1,最大15,(路由器不能超过15台)16代表不可达。 入接口附加度量值 rip metricin 5 //可以修改开销改变路径。只能增加,不能减小 …

count(*) over (partition by ……)用法详解

select id,count(*) over(partition by pro_id) from sal; 以pro_id分组,统计分组后每个pro_id的记录总数及对应的id; 类似还有count(*) over(order by ……)、sum(amount) over(partition by ……)等,略有区别

降低企业运营成本的API服务有哪些?

通过API服务,企业可以实现许多功能和服务的自动化和优化,从而有效降低企业的运营成本。API服务可以帮助企业简化流程、减少人工操作、提高效率,并提供数据支持和决策依据,从而实现成本的有效控制和降低。无论是人力资源管理、客户…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(一)

译注 由于 1.2.2 小节介绍 SVG 的篇幅过多,为了方便查阅,后续将分多个小节依次进行翻译。为了确保整个 1.2.2 小节的完整性,特意将上一篇包含的 SVG 小节的内容整理出来重新编排。敬请留意。 1.2.2 SVG - 可缩放矢量图形 可伸缩矢量图形&…

kaoYan-English

英语的提高是个日积月累,可以花一个月时间突击政治。但英语不可。关键在于单词和阅读理解 提高英语成绩的捷径,多做阅读题。阅读理解的分值高,阅读理解在巩固词汇,培养语感有不可替代作用。 选资料,贴合考研难度的&a…

x264 编码器 i_intra_cost 计算过程

介绍 是uint16_t类型指针变量,用来存储每个宏块的帧内代价值,在 frame.h 文件中x264_frame_t结构体中声明。在*frame_new 函数中将lowres_costs[0][0]指向给i_intra_cost,并 memset 为-1;//代码有删减 frame->i_intra_cost = frame->lowres_costs[0][0]; memset( fra…

Raspbian命令行连接WiFi网络

Raspbian命令行连接WiFi网络 1. 源由2. 环境3. 信号4. 连接5. 检查6. 断开 1. 源由 “懒人”多福,是什么原因,大家知道不,哈哈。 如果大家关注过之前《Ardupilot开源代码之Rover上路计划》,为了笔记本电脑在不断网的情况下进行配…

Rust 中使用 :: 这种语法的几种情况

文章目录 1. 访问模块成员:2. 访问关联函数或静态方法:3. 访问 trait 的关联类型或关联常量4. 指定泛型类型参数 1. 访问模块成员: mod utils {pub fn do_something() { /* ... */ } }let result utils::do_something();2. 访问关联函数或静…

【Spring Cloud Alibaba AI】简单使用

本文基于官方文档。 Spring AI 官方文档:Spring AI :: Spring AI Reference 中文文档:Spring AI 简介 - spring 中文网 (springdoc.cn) Spring AI 是 Spring 官方社区项目,旨在简化 Java AI 应用程序开发,让 Java 开发者像使用…

达梦数据库死锁排查和解决

达梦数据库死锁排查和解决 链接: 达梦数据库死锁排查和解决

道路元素位置和方向的坐标系统: 点 线 面 连接点

道路元素位置和方向的坐标系统: 下图道路元素在地球坐标系中的位置,该位置由三个坐标轴(x, y, z)组成的笛卡尔坐标系来确定。这种描述特别适用于三维建模和地理信息系统(GIS)中,其中道路被视为一个三维模型…