设计模式(三)代理模式

目录

一、什么是代理模式

二、静态代理

1、定义

2、代码

2.1、接口

2.2、被代理对象

 2.3、代理对象

 2.4、测试

三、动态代理

1、定义

2、代码

 2.1、接口

2.2、目标对象

 2.3、代理对象

 2.4、测试


一、什么是代理模式

代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

在生活中的例子也非常多,例如你不好意思向你关系不太好朋友帮个忙,这时需要找一个和它关系好的应一个朋友帮忙转达,这个中间朋友就是代理对象。例如购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。

代理模式主要有三种形式,分别是静态代理动态代理(也称JDK代理、接口代理)和cglib代理(在内存动态创建对象而不需要实现接口,也可属于动态代理的范畴)

二、静态代理

1、定义

静态代理是定义父类或者接口,然后被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。代理对象与目标对象实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。

  • 优点:可不修改目标对象的功能,通过代理对象对目标功能扩展。
  • 缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,一旦接口增加方法,目标对象与代理对象都要维护

比如老师代课的案例:

  • ITeacherDao:接口
  • TeacherDao:目标对象,实现接口ITeacherDao
  • TeacherDAOProxy:代理对象,也实现ITeacherDao接口,并且聚合ITeacherDao属性,通过构造器传参设置值,调用的时候通过调用代理对象的方法来调用目标对象。

2、代码

2.1、接口

public interface ITeacherDao {void teach(); // 授课的方法
}

2.2、被代理对象

public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {System.out.println("一键三连");}
}

 2.3、代理对象

public class TeacherDaoProxy implements ITeacherDao {private ITeacherDao target; //通过接口聚合目标对象public TeacherDaoProxy(ITeacherDao target) {this.target = target;}@Overridepublic void teach() { //重写接口System.out.println("静态代理开始");target.teach();System.out.println("静态代理结束");}
}

 2.4、测试

public class Client {public static void main(String[] args) {//创建被代理对象TeacherDao teacherDao = new TeacherDao();//创建代理对象, 同时将被代理对象传递给代理对象TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);//通过代理对象,调用到被代理对象的方法teacherDaoProxy.teach();}
}

三、动态代理

1、定义

动态代理也叫JDK代理、接口代理。它使代理对象不需要实现接口(但目标对象要实现接口),代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。

即使用JDK包java.lang.reflect.Proxy中的newProxyInstance方法来动态的创建目标对象(被代理对象),该方法需要如下接收三个参数:

1)ClassLoader loader
指定当前目标对象使用的类加载器
2)Class<?>[] interfaces
目标对象实现的接口类型,使用泛型方法确认类型
3)InvocationHandler h
事情处理,执行目标对象的方法时,会触发事情处理器方法,把当前执行的目标对象方法作为参数传入

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

类图:

核心是getProxyInstacne()

1)根据传入的对象TeacherDao目标对象

2)利用返回机制,返回一个代理对象

3)然后通过代理对象,调用目标对象方法

2、代码

 2.1、接口

public interface ITeacherDao {void teach();void tesst(String name);
}

2.2、目标对象

public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {System.out.println("一键三连");}@Overridepublic void tesst(String name) {System.out.println("传参测试:" + name);}
}

 2.3、代理对象

public class ProxyFactory {//维护一个目标对象 , Objectprivate Object target;//构造器 , 对target 进行初始化public ProxyFactory(Object target) {this.target = target;}//动态生成一个代理对象public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() { //匿名类重写invoke方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("动态代理开始");Object returnVal = method.invoke(target, args);//反射机制调用目标对象的方法System.out.println("动态代理结束");return returnVal;}});}
}

 2.4、测试

public class Client {public static void main(String[] args) {//创建目标对象ITeacherDao target = new TeacherDao();//创建代理对象ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();//内存中动态生成了代理对象System.out.println(proxyInstance.getClass());//通过代理对象,调用目标对象的方法proxyInstance.teach();proxyInstance.tesst("一键三连");}
}

 运行结果:

参考:https://blog.csdn.net/qq_45034708/article/details/115030032

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

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

相关文章

【前端】[vue3] [uni-app] 组件样式击穿:deep

我是在开发uni-app时测试的思路&#xff0c;大家可以借鉴一下。 我这边测试的是uni组件&#xff0c;但是我觉得即便你用element-plus之类的&#xff0c;样式击穿的思路都相同。 我自定义了一个全局样式scss文件&#xff0c;并引入到了项目中。(如图) 利用vue3 中的 deep 方式…

人脸识别——可解释的人脸识别(XFR)人脸识别模型是根据什么来识别个人的

可解释性人脸识别&#xff08;XFR&#xff09;&#xff1f; 人脸识别有一个任务叫1:N&#xff08;识别&#xff09;。这个任务将一个人的照片与N张注册照片进行比较&#xff0c;找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中&#xff0c;任务从监控摄像…

【论文笔记】Parameter-Effificient Transfer Learning for NLP

题目:Parameter-Effificient Transfer Learning for NLP 阅读 文章目录 0.摘要1.引言2 Adapter tuning for NLP3 实验3.1 参数/性能平衡3.2 讨论 4.相关工作 0.摘要 克服微调训练不高效的问题&#xff0c;增加一些adapter模块&#xff0c;思想就是固定原始的网络中的参数&…

mysql model_path longblob 类型文件操作

在 MySQL 中&#xff0c;如果你有一个表包含一个 LONG BLOB 类型的字段&#xff08;例如 model_path&#xff09;&#xff0c;你可以使用 SQL 查询来提取该字段中的二进制数据&#xff0c;并将其下载为文件。以下是一个完整的步骤来实现这个过程&#xff1a; 步骤1&#xff1a;…

开源低代码平台,JeecgBoot v3.7.0 里程碑版本发布

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

90V转12V1A恒压WT6039

90V转12V1A恒压WT6039 WT6039降压DC-DC转换器芯片专为处理宽泛的电压输入范围设计&#xff0c;支持从12V至90V。该芯片集成了关键功能&#xff0c;如使能控制开关、参考电源、误差放大器、过热保护、限流保护及短路保护等&#xff0c;以确保系统在各种操作条件下的安全与稳定性…

qt开发-05_QPushButton

按钮是最常用的控件&#xff1b; 如果找不到文件可以这样&#xff1a; 选择这个复制文件的路径&#xff0c;粘贴就可以了。 在qt中新建一个项目&#xff0c;并且打开ui界面添加一个按钮&#xff1b; 右键这个按钮可以有很多功能&#xff1a; 先是这个转到槽&#xff0c;这个就…

netcore 生成验证码

安装依赖 Install-Package Lazy.Captcha.Core 注册服务 builder.Services.AddCaptcha(); 自定义注册服务 // 注册服务的时候增加配置 services.AddCaptcha(Configuration, option > {option.CaptchaType CaptchaType.WORD; // 验证码类型option.CodeLength 6; // 验证…

六月惊喜| 事件分析Plus上线

前情回顾 ClkLog在四月先上线了一版<事件分析>&#xff0c;可以通过元数据的配置&#xff0c;创建并统计自定义事件的数据情况&#xff08;例如&#xff1a;用户数、触发次数、人均次数&#xff09;。 功能上线后好多小伙伴说希望我们加紧上线自定义的事件分析。ClkLog实…

【Java】已解决java.net.HttpRetryException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例 已解决java.net.HttpRetryException异常 在Java的网络编程中&#xff0c;尤其是使用Apache HttpClient或其他类似的HTTP客户端库时&#xff0c;可能会遇到java.net.HttpRetryException异常。这个…

动态IP与静态IP,如何选择更适合你的类型?

在当今数字化时代&#xff0c;互联网已成为我们日常生活和工作中不可或缺的一部分。而IP地址作为互联网通信的基础&#xff0c;扮演着至关重要的角色。在选择IP地址类型时&#xff0c;动态IP和静态IP是两种常见的选择。IPIDEA代理IP将为大家详细解析这两种IP的特点&#xff0c;…

【SPIE出版】第六届无线通信与智能电网国际会议(ICWCSG 2024,7月26-28)

随着科技的飞速发展和能源需求的日益增长&#xff0c;智能电网技术逐渐成为电力行业的重要发展方向。与此同时&#xff0c;无线通信技术在近年来也取得了显著的进步&#xff0c;为智能电网的发展提供了强有力的支持。为了进一步推动无线通信与智能电网的结合与发展&#xff0c;…

2024最新最全【网络安全/渗透测试】面试题汇总

思路流程 信息收集漏洞挖掘漏洞利用&权限提升清除测试数据&输出报告复测 问题深信服一面:SQL注入防护为什么参数化查询可以防止sql注入SQL头注入点盲注是什么&#xff1f;怎么盲注&#xff1f;宽字节注入产生原理以及根本原因 产生原理在哪里编码根本原因解决办法sql里…

这才多久,ChatGPT-4o 又被碾压了?

大模型皇位易主&#xff1f; 昨天&#xff0c;OpenAI 的竞争对手 Anthropic 发布了其最强大的 AI 模型&#xff1a;Claude 3.5 Sonnet。 目前&#xff0c;Claude 3.5 Sonnet 已经在 Claude.ai 和 Claude iOS 应用程序上免费提供。 据 Anthropic 号称&#xff0c;Claude 3.5 Son…

2005年上半年软件设计师【下午题】试题及答案

文章目录 2005年上半年软件设计师下午题--试题2005年上半年软件设计师下午题--答案2005年上半年软件设计师下午题–试题

自动化测试:Autorunner的使用

自动化测试&#xff1a;Autorunner的使用 一、实验目的 1、掌握自动化测试脚本的概念。 2、初步掌握Autorunner的使用 二、Autorunner的简单使用 autoRunner使用方法 新建项目 a) 在项目管理器空白区域,右键鼠标,选择新建项目 b) 输入项目名后,点击[确定]. 在初次打开aut…

中国机器人产业崛起,德国市场面临30%的份额挑战

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着科技的不断进步&#xff0c;机器人行业正迎来前所未有的发展机遇。令人震惊的是&#xff0c;根据最新统计数据&#xff0c;中国机器人产业在…

echarts实现折线图点击添加标记

文章目录 背景一、代码示例 背景 业务场景体现在功能层面主要两点&#xff0c; 折线图表设置点击事件点击事件与图标渲染标记绑定 对于节点没有被添加标记的可以&#xff0c;弹框提示添加标记&#xff0c;并提供标记内容输入框&#xff0c;已经添加过标记的点&#xff0c;点…

策略模式编程

接口定义&#xff1a; public interface ProcessParserStrategy { List<ProcessInfo> parser(String osType, String processInfo); String getApp(); } public interface ConfigParserStrategy { List<ConfigInfo> parser(String configInfo); String getConfigT…

MongoDB安装配置教程(详细版)

MongoDB安装配置教程&#xff08;详细版&#xff09; 1.下载与安装2.环境配置3.开机自启动 1.下载与安装 下载MongoDB数据库地址&#xff1a;&#xff08;会自动检测电脑版本&#xff0c; 下载合适的MongoDB 版本号&#xff09; https://www.mongodb.com/try/download/commun…