【Java】【设计模式】动态代理

因为需要看spring源代码,看到代理这个词看不懂,后面顺着线索发现需要学习一下设计模式的动态代理,然后疯狂补课,结果发现,都不知道在说什么例子给的也比较抽象,好在自己付出快4小时还是有一些微弱的感悟的。写一写,免得自己忘记也可以帮一帮码友。

首先是例子,我发现其他博客写的例子,也就是什么中介什么租房子,根本感觉不适合理解他的本质,他虽然能够快速理解三方但是我一直没明白内核。

他的内核实际上非常的简单,就是我有一个代码A,但是我现在需要针对代码A执行之后,我需要立即执行一下代码B。(或者在代码A之前我一定要执行代码A)那简单直接B CV一下到代码A不就完了。

不行! 不够优雅~
其实只是破坏了软件开发原则,尽量让自己已经写完的代码尽量不去修改。
所以这时候要一个代理!
所以他要完成的工作就是在代码A之上,完成代码B。也就是完全不动已经原有的代码,新增一个代理类就能够实现。

所以在结合什么中介那三个模型,你就能够明白被代理的实际上就是不想改代码的A,也就是房东,proxy也就是中介,调用者也就是租客。

但最重要的是:lz就是不想改A代码,我就是要写增量式
这个才是核心是目标,也是我个人认为为啥要有代理模式。。。

好了,明白这个原理,去看别人写的代码就好理解很多很多很多了。

这里贴两个个人觉得写的比较好的博客:
https://blog.csdn.net/Passer_hua/article/details/122617628
https://blog.csdn.net/m0_51380306/article/details/119912574

我个人插一嘴,我并没有get到静态代理跟直接JDK使用的动态代理有什么区别。
因为我的理解是,从代码编码角度来说,我都是做到了代码A不动,新增一个类,然后PSVM执行写一写。
完了我看到那个博客说的是在生成代理不同,确实,因为静态代理中,我们编写的实际上就是代理类,但是在JDK里面反而不是,相当于只是一个Factory类似的东西,最终的代理是在proxy.newinstance那边生成的。
但在我看来我还是没有太感受到他们之间的差别。
写着突然感觉可以猜到,应该是在proxy第二个参数那边,传入接口数组那边可能能写个花的。。但我现在还参透不了。
有大神希望解答一下,谢谢~

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

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

相关文章

Spring Cloud: openFegin使用

文章目录 一、OpenFeign简介二、Springboot集成OpenFeign1、引入依赖2、EnableFeignClients注解(1)应用(2)属性解析 3、 FeignClient(1)应用(2)属性解析(3)向…

基于百度地图实现Android定位功能实现(一)

Android集成百度地图 文章目录 Android集成百度地图前言准备工作创建工程申请密钥 在项目中集成BaiduMap SDK创建地图 前言 本案例使用百度地图实现在Android中集成地图,并且实现了普通地图/卫星地图,以及路况图和热状图功能; 参考技术文档&…

Android SQLite的使用

前言 本文用于介绍SQLite,SQLite是Android内置的数据库,是一款轻量级的关系型数据库。它具有运算速度快、占用资源少等优点。支持SQL语法同时遵循数据库的ACID事务。 创建数据库 Android为我们提供了一个SQLiteOpenHelper帮助类,我们可以在…

MTU/TCPMSS/VLAN/ACCESS/TRUNK/HYBRID

MTU RFC标准定义以太网的默认MTU值为1500 最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节&am…

OpenFeign使用

OpenFeign天然支持负载均衡 想要去消费接口的API的服务引入pom依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 主启动类上加注解 EnableFeignC…

C++入门(二)

目录 函数重载&#xff1a; 函数重载概念&#xff1a; 参数类型不同&#xff1a; 参数个数不同&#xff1a; 参数类型顺序不同&#xff1a; C支持函数重载的原理--名字修饰&#xff1a; 引用&#xff1a; 引用概念&#xff1a; 引用特性&#xff1a; 常引用&#xff1…

网页的血液——javascript

1.简介 网络开发唯一可选语言&#xff0c; 增加网页动态性与交互性&#xff0c;服务端开发&#xff0c; Nodejs&#xff0c;可以进行数据库文件读写 2.引入 html内部使用script标签&#xff0c;在script内部直接编写js 在外部js文件中编写&#xff0c;在script内部通…

JJJ:linux系统中第一个进程

以linux4.19内核linux系统中第一个进程。 执行shell指令 ps -ef 结果如下&#xff1a; xxxxxx-virtual-machine:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:55 ? 00:00:02 /sbin/init splash root …

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型&#xff08;Bag of Words, BoW&#xff09;和N-gram模型主要用于早期的自然语言处理任务&#xff0c;上文中我介绍了机器是如何读懂文本的四个阶段&#xff0c;这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

C语言二进制常用逻辑运算符介绍与使用

在C语言中&#xff0c;二进制常用的逻辑运算符包括与&#xff08;AND&#xff09;、或&#xff08;OR&#xff09;、非&#xff08;NOT&#xff09;&#xff0c;以及异或&#xff08;XOR&#xff09;。以下是它们的介绍和使用方法&#xff1a; 与&#xff08;AND&#xff09;&a…

Nodejs 第六十章(http缓存)

HTTP缓存 HTTP 缓存主要分为两大类&#xff1a;强缓存和协商缓存。这两种缓存都通过 HTTP 响应头来控制&#xff0c;目的是提高网站性能。 强缓存介绍 强缓存之后则不需要向服务器发送请求&#xff0c;而是从浏览器缓存读取分为&#xff08;内存缓存&#xff09;| &#xff…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

《Long-CLIP: Unlocking the Long-Text Capability of CLIP》

论文:https://arxiv.org/pdf/2403.15378.pdf源码:https://github.com/beichenzbc/Long-CLIP 导读 CLIP(Contrastive Language–Image Pre-training),这个由 OpenAI 团队开源的多模态预训练模型,它通过对比学习的方式,同时学习图像和文本的表示,从而实现在没有针对特定…

坐标变换矩阵之平移-opencv

平移矩阵m&#xff0c;平移向量(tx,ty,tz) double tx10.2; double ty0.0; double tz0.0; cv::Mat m cv::Mat::eye(4, 4, CV_64FC1);//单位矩阵 m.at<double>(0,3)tx; m.at<double>(1,3)ty; m.at<double>(2,3)tz;齐次点p(1,0,0,1)&#xff0c; cv::Mat p(4…

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

SEO文章写作器,批量写作原创SEO收录文章

在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了网站获得流量和曝光度的关键手段之一。而在SEO领域中&#xff0c;内容的质量和原创性是至关重要的。为了应对不断增长的内容需求&#xff0c;越来越多的人开始转向AI写作生成器&#xff0c;这些…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

32-4 APP渗透 - APP渗透与防御

一、APP渗透测试流程 准备阶段: 确定安全测试的范围,包括受测方的测试目标和敏感数据。获取被测单位的书面盖章渗透测试授权,确保合法性和透明度。(重要)信息搜集: 收集关于APP的环境、业务用例和架构等信息,了解目标系统的特点和运行环境。可以使用各种信息收集工具和技术…

通俗易懂:什么是Java虚拟机(JVM)?它的主要作用是什么?

Java虚拟机&#xff08;Java Virtual Machine, JVM&#xff09;是一种软件实现的抽象计算机&#xff0c;它负责执行Java字节码&#xff08;Bytecode&#xff09;。Java程序并不是直接在物理计算机上运行&#xff0c;而是先由Java编译器将源代码编译成与平台无关的字节码&#x…

基于springboot实现房产销售系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房产销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统…