当前位置:首页 > CN2资讯 > 正文内容

玩转JAVA代理模式java 代理模式

1天前CN2资讯
概念剖析

代理模式 是指为其他对象提供一种代理,以控制对这个对象的访问,代理对象在 客户端和目标对象 之间起到中介作用,属于结构型设计模式。

应用场景

该 设计模式 灵活的运用在 spring 的AOP(面向切片编程)中。

模式分类

静态代理、动态代理

实例演示

静态代理


场景描述:《相亲》张三有个找媳妇的需求,于是他找到了媒婆,媒婆就去物色美女满足张三的需求。

从上面这个场景中,我们可以看到:媒婆和张三 有一个共性都是人并且都有找美女的需求。所以,我们创建一个人的接口,一个张三类和一个媒婆类。

IPerson 接口

package proxy; /** * ClassName: IPerson <br/> * Description: <br/> * date: 2021/7/9 17:37<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public interface IPerson { void findBeauty(); }

张三 类

package proxy; /** * ClassName: ZhangSan <br/> * Description: <br/> * date: 2021/7/9 17:40<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public class ZhangSan implements IPerson{ @Override public void findBeauty() { System.out.println("相亲要求:皮肤白,大长腿"); } }

媒婆 类

package proxy; /** * ClassName: MeiPo <br/> * Description: <br/> * date: 2021/7/9 17:42<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public class MeiPo implements IPerson{ private ZhangSan zhangSan; public MeiPo(ZhangSan zhangSan) { this.zhangSan = zhangSan; } @Override public void findBeauty() { System.out.println("走遍世界,寻找美女"); zhangSan.findBeauty(); System.out.println("如期交货"); } }

测试代码 

package proxy; /** * ClassName: Main <br/> * Description: <br/> * date: 2021/7/9 21:21<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public class Main { public static void main(String[] args) { MeiPo meiPo = new MeiPo(new ZhangSan()); meiPo.findBeauty(); } }

运行效果

 善于思考的同学会发现这个存在一个弊端,那就是 这个媒婆代理存在局限性,只能为张三服务,这样肯定是不行滴,所以,出现了下面的动态代理。

动态代理


动态代理,就是动态创建代码在JVM虚拟机内存中跑,这个类是动态创建的,只存在于JVM内存中,不存在于实际。

实现方式:jdk库或cglib库

代码示例

人类 接口

package jdkProxy; /** * ClassName: IPenson <br/> * Description: <br/> * date: 2021/7/10 10:04<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public interface IPenson { void findBeauty(); }

媒婆代理 类

package jdkProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * ClassName: JDKMeiPo <br/> * Description: <br/> * date: 2021/7/10 10:12<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public class JDKMeiPo implements InvocationHandler { //第二步:存储需要代理的对象,方便第三步使用 private Object mTarget; //第一步:获取动态创建的实例对象 public Object getInstance(Object target){ mTarget = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //第三步:执行被调用的方法 before(); method.invoke(mTarget,args); after(); return null; } private void after() { System.out.println("如期交货"); } private void before() { System.out.println("走遍世界,寻找美女"); } }

张三 类

package jdkProxy; /** * ClassName: ZhangSan <br/> * Description: <br/> * date: 2021/7/10 10:20<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public class ZhangSan implements IPenson{ @Override public void findBeauty() { System.out.println("相亲要求:皮肤白,大长腿"); } }

 测试类

package jdkProxy; /** * ClassName: test <br/> * Description: <br/> * date: 2021/7/10 10:19<br/> * * @author yiqi<br /> * @since JDK 1.8 */ public class test { public static void main(String[] args) { //第一步:创建代理 JDKMeiPo jdkMeiPo = new JDKMeiPo(); //第二步:获取动态创建的实体类 ,注意 这个实体类是动态创建的,已经不是张三了 IPenson penson = (IPenson) jdkMeiPo.getInstance(new ZhangSan()); //第三步:这个方法不是直接调用张三的 findBeauty() 方法,而是触发 invoke() 的调用 penson.findBeauty(); } }

效果展示

 如果大家领悟了上面动态代理的真谛,那么学习 cglib 就会非常简单,因为它都不用管你的接口,直接覆写类的所有方法,大家可以百度自行尝试。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24910.html

    分享给朋友:

    “玩转JAVA代理模式java 代理模式” 的相关文章

    V.PS荷兰VPS:低延迟高稳定性的中国用户首选云服务器

    V.PS公司简介 V.PS是一家专注于提供海外节点VPS云服务器的主机商,拥有覆盖全球几大洲的多个机房。对于国内用户来说,V.PS的网络线路表现尤为出色,能够提供稳定且快速的连接体验。V.PS致力于为用户提供高质量的云服务器服务,无论是个人用户还是企业用户,都能在这里找到适合自己的解决方案。 荷兰服...

    Windows中类似rcopy的软件推荐:提升文件复制效率的必备工具

    Windows文件复制的挑战 在Windows操作系统中,文件复制是一个日常操作,但默认的文件复制功能往往无法满足高效、稳定的需求。尤其是在处理大文件或大量文件时,系统自带的复制工具可能会遇到速度慢、容易中断、缺乏错误处理等问题。这些问题不仅影响工作效率,还可能导致数据丢失或损坏。对于需要频繁进行文...

    全球主机交流论坛:提升技术的最佳平台

    全球主机论坛概述 在当今数字化时代,全球主机论坛扮演着越来越重要的角色。这些论坛不仅是技术爱好者的聚集地,更是为需要域名、主机、VPS和服务器信息的用户提供了一个交流的平台。我作为一名站长,经常在这样的论坛上交流经验、获取灵感和解决技术难题,论坛的存在极大地丰富了我的网络建设之旅。 主机论坛的定义其...

    搬瓦工补货通知及高性价比套餐推荐

    搬瓦工的补货通知对许多用户来说非常重要,尤其是在需求不断增加的背景下。补货通知不仅帮助用户了解最新的套餐信息,还能在价格优惠时把握购买机会。对于我而言,时常关注这些通知意味着能以最低的价格获得高配置的套餐,这无疑是提升我网络体验的重要一步。 为了随时获取补货信息,搬瓦工提供了多种渠道供用户选择。大家...

    全面解析VPS测评:如何选择最佳虚拟专用服务器

    了解VPS(虚拟专用服务器)对许多人来说并不陌生。在我们的网络环境中,VPS作为一种重要的服务器解决方案,广泛应用于网站托管、应用开发、以及各种在线服务的支持。VPS让用户可以在共享环境中获得类似独立服务器的资源,提供了灵活性和更好的性能。与共享主机相比,VPS的显著优势在于更高的资源保障和自定义能...

    如何有效进行Payoneer绑定PayPal的详细步骤指南

    在目前的数字支付环境中,Payoneer和PayPal是两个广受欢迎的支付平台。首先,Payoneer(派安盈)是一个全球化的支付解决方案,专为跨境电商卖家、独立站卖家及B2B外贸商家设计。它支持多种货币的收付款服务,覆盖190个国家,包含了70种币种。这意味着无论在哪个地方进行交易,Payonee...