java----------->代理模式

news2025/5/17 4:31:45

目录

什么是代理模式?

为什么会有代理模式?

怎么写代理模式?

实现代理模式总共需要三步:


什么是代理模式?

代理模式:给目标对象提供一个代理对象,并且由代理对象控制目标对象的引用

代理就是不允许用户访问当前核心类


为什么会有代理模式?

假设有一个类,类中写一个转账的方法:

zhuanzhang(nameA, nameB, money)

此时,一个test类就就可以直接访问该方法,这时有很多安全漏洞:a,b,name都没有经过验证就直接执行程序,完全没有考虑过a,b是否存在,money是否足够的问题

而如果把对参数的验证写到转账方法所在的类中,转账的核心方法可能就不是转账而是验证,而且代码的更改很难做到

因为当原有的写好的逻辑当中,需要增加新的功能时,由于当前整个逻辑是通顺的,不能轻易改动代码,此时,就需要代理模式解决该问题,还能够增强原有的逻辑功能

所以,代理对象相当于用户与核心方法之间的一个中介


怎么写代理模式?

如上面的例子,若转账类生成转账对象,又有代理类生成代理对象,

由代理对象控制对转账对象的引用,而此时用户在调用过程中能调用的方法都是代理方法,能看到的对象都是代理对象,

也就是说,目标对象/核心方法不对外提供引用

实现代理模式总共需要三步:
  1. 代理类实现对目标类的引用
  2. 知道目标类的核心方法是什么
  3. 调用目标类的核心方法

1.代理类如何控制目标类的引用?

就是去创建对象

一般情况下代理对象也要设置成private

用户不被允许访问当前的转账方法

2.怎样知道目标类的核心方法是什么?

可以利用反射

Proxy.newProxyInstance(o.getClass().getClassLoader(), 
o.getClass().getInterfaces(),h:this);

//此时,o表示Object类型参数变量
//o.getClass().getClassLoader()  获取目标类的构造器
//o.getClass().getInterfaces()   获取目标类实现的接口

3.怎么调用目标类的核心方法?

只要在代理对象中写一个方法,该方法调用目标方法

对于用户来说,就像是直接调用了目标对象,

对于代理对象来说,实际上是调用了当前目标对象的类

当用户类去创建代理对象时,代理对象中就创建好了目标对象

通过method.invoke()调用核心方法(该方法为method包中自带),如图:


代理模式的核心功能

  1. 通过代理对象间接访问目标对象,通过防止用户直接访问目标对象,给系统带来不必要的复杂        性,即直接调用转账对象里的方法就有可能会出现前文所说的风险
  2. 通过代理业务对原有业务进行增强

代理模式分类

代理模式分为静态代理动态代理

静态代理和动态代理的一大区别在于代理类和代理对象的关系

如图:

静态代理:

  • 优点:实现起来较简单,易于理解和维护。
  • 缺点:代理类需要为每个接口都进行单独实现,如果接口方法发生变化,代理类也需要相应地修改,可扩展性较差。

且静态代理严格意义上不算代理

动态代理:

动态代理有两种实现方式:

<1>jdk                <2>cglib

这篇只介绍jdk

如何实现动态代理中代理类对代理对象一对多而代理对象对目标对象一对一的情况?

答:Object

在代理对象的方法中添加一个Object类型参数,参数对应要调用的目标方法即可实现

但其知道目标对象是什么,但是不知道目标对象里的方法是什么

如果使用接口并直接在接口后面添加方法名,此时破坏了开闭原则

此时就需要利用反射知道目标的核心方法

补:
 

是构建对象的模板,先必须创建出类来,才能把对象给创建出来

接口(Interface) 是一种抽象类型,是抽象方法的集合。一个类通过实现接口的方式,从而继承接口的抽象方法。接口的定义方式与类相似,但它们属于不同的概念。接口不能被实例化,但可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

对于代理模式的使用,常见的有,远程代理、虚拟代理、保护代理等等

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

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

相关文章

Untiy基础学习(十四)核心系统—物理系统之碰撞检测代码篇 刚体,碰撞体,材质

目录 一、碰撞器&#xff08;Collider&#xff09;与触发器&#xff08;Trigger&#xff09; 二、碰撞检测条件 三、碰撞事件与触发器事件&#xff0c;可以理解为特殊的生命周期函数。 四、讲讲如何选择 ​编辑 五、总结 一、碰撞/触发事件函数对照表 二、Collider 与 …

SAP学习笔记 - 开发08 - Eclipse连接到 BTP Cockpit实例

有关BTP&#xff0c;之前学了一点儿&#xff0c;今天继续学习。 SAP学习笔记 - 开发02 - BTP实操流程&#xff08;账号注册&#xff0c;BTP控制台&#xff0c;BTP集成开发环境搭建&#xff09;_sap btp开发-CSDN博客 如何在Eclipse中连接BTP Cockpit开发环境实例。 1&#xf…

Git的安装和配置(idea中配置Git)

一、Git的下载和安装 前提条件&#xff1a;IntelliJ IDEA 版本是2023.3 &#xff0c;那么配置 Git 时推荐使用 Git 2.40.x 或更高版本 下载地址&#xff1a;CNPM Binaries Mirror 操作&#xff1a;打开链接 → 滚动到页面底部 → 选择2.40.x或更高版本的 .exe 文件&#xf…

【2025版】Spring Boot面试题

文章目录 1. Spring, Spring MVC, SpringBoot是什么关系&#xff1f;2. 谈一谈对Spring IoC的理解3. Component 和 Bean 的区别&#xff1f;4. Autowired 和 Resource 的区别&#xff1f;5. 注入Bean的方法有哪些&#xff1f;6. 为什么Spring 官方推荐构造函数注入&#xff1f;…

火山引擎实时音视频 高代码跑通日志

实时音视频 SDK 概览--实时音视频-火山引擎 什么是实时音视频 火山引擎实时音视频&#xff08;Volcengine Real Time Communication&#xff0c;veRTC&#xff09;提供全球范围内高可靠、高并发、低延时的实时音视频通信能力&#xff0c;实现多种类型的实时交流和互动。 通…

jenkins 启动报错

java.lang.UnsatisfiedLinkError: /opt/application/jdk-17.0.11/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory。 解决方案&#xff1a; yum install freetype-devel 安装完成之后重启jenkins。

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案

无人机天线拉远RFOF方案通过光纤替代传统射频电缆&#xff0c;实现无人机与地面控制站之间的高保真、低损耗信号传输&#xff0c;尤其适用于高频段&#xff08;如毫米波&#xff09;、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…

程序设计语言----软考中级软件设计师(自用学习笔记)

目录 1、解释器和编译器 2、程序的三种控制结构 3、程序中的数据必须具有类型 4、编译、解释程序翻译阶段 5、符号表 6、编译过程 7、上下文无关文法 8、前、中、后缀表达式 9、前、后缀表达式计算 10、语法树中、后序遍历 11、脚本语言和动态语言 12、语法分析方法…

通过SMTP协议实现Linux邮件发送配置指南

一、环境准备与基础配置 1. SMTP服务开通&#xff08;以qq邮箱为例&#xff09; 登录qq邮箱网页端&#xff0c;进入「设置」-「POP3/SMTP/IMAP」 开启「SMTP服务」并获取16位授权码&#xff08;替代邮箱密码使用&#xff09; 记录关键参数&#xff1a; SMTP服务器地址&#…

若依框架页面

1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习&#xff0c;不要攻击哦&#xff0c;谢谢啊

44、私有程序集与共享程序集有什么区别?

私有程序集&#xff08;Private Assembly&#xff09;与共享程序集&#xff08;Shared Assembly&#xff09;是.NET框架中程序集部署的两种不同方式&#xff0c;它们在部署位置、版本控制、访问权限等方面存在显著差异&#xff0c;以下是对二者的详细比较&#xff1a; 1. 部署…

【Java面试题】——this 和 super 的区别

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 【前言】 在Java的世界里&#xff0c;this和 super是两个非常重要且容易混淆的关键字。无论是在日常…

CentOS 7 内核升级指南:解决兼容性问题并提升性能

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; CentOS 7 默认搭载的 3.10.x 版本内核虽然稳定&#xff0c;但随着硬件和软件技术的快速发展&#xff0c;可能面临以下问题&#xff1a; 硬件兼容性不足&#xff1a;新…

解决 PicGo 上传 GitHub图床及Marp中Github图片编译常见难题指南

[目录] 0.行文概述 1.PicGo图片上传失败 2.*关于在Vscode中Marp图片的编译问题* 3.总结与启示行文概述 写作本文的动机是本人看到了Awesome Marp&#xff0c;发现使用 Markdown \texttt{Markdown} Markdown做PPT若加持一些 CSS , JavaScript \texttt{CSS},\texttt{JavaScript} …

软考 系统架构设计师系列知识点之杂项集萃(59)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;58&#xff09; 第96题 假设关系模式R(U, F)&#xff0c;属性集U{A, B, C}&#xff0c;函数依赖集F{A->B, B->C}。若将其分解为p{R1(U1, F1), R2(U2, F2)&#xff0c;其中U1{A, B}, U2{A, …

python使用matplotlib画图

【README】 plot画图有两种方法&#xff1a;包括 plt.plot(), ax.plot()-画多个子图 &#xff0c;其中ax表示某个坐标轴; 【1】画单个图 import matplotlib # 避免兼容性问题&#xff1a;明确指定 matplotlib 使用兼容的后端&#xff0c;TkAgg 或 Agg matplotlib.use(TkAgg) …

upload-labs通关笔记-第5关 文件上传之.ini绕过

目录 一、ini文件绕过原理 二、源码审计 三、渗透实战 1、查看提示 2、制作.user.ini文件 &#xff08;1&#xff09;首先创建一个文本文件 &#xff08;2&#xff09;保存文件名为.user.ini 2、制作jpg后缀脚本 &#xff08;1&#xff09;创建一个文本文件 &#xf…

ssti模板注入学习

ssti模板注入原理 ssti模板注入是一种基于服务器的模板引擎的特性和漏洞产生的一种漏洞&#xff0c;通过将而已代码注入模板中实现的服务器的攻击 模板引擎 为什么要有模板引擎 在web开发中&#xff0c;为了使用户界面与业务数据&#xff08;内容&#xff09;分离而产生的&…

填涂颜色(bfs)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 含泪播种的人一定能含笑收获! 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现…

ros1+docker环境快速搭建

快速使用python 解析ros1的bag消息ros这个东西可以说安装起来非常麻烦的&#xff0c;费时费力&#xff0c;很可能还安装不成功&#xff0c;特别是我的环境是ubuntu22.04 &#xff0c;官方都不支持安装ros1。因此一个可行且快速的方法是使用别人配置好的ros的docker环境 一、下…