理解设计模式——代理模式

  • 定义
  • 模式类型
  • 实现方法
    • 静态代理
    • JDK动态代理
    • CGLIB代理

定义

由于某些原因需要给对象提供一个代理以控制对该对象的访问,这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

模式类型

结构型设计模式

实现方法

静态代理

代码示例

//买房者
public interface Buyer {void buyHouse();
}
//私人
public class person implements Buyer{@Overridepublic void buyHouse() {System.out.println("私人买房");}
}
//中介代理购房
public class proxy implements Buyer{private Buyer buyer;public proxy(Buyer buyer) {this.buyer = buyer;}@Overridepublic void buyHouse() {//增强功能:快速筛选合适房屋System.out.println("筛选合适房屋");//增强功能:带看房System.out.println("带看房");buyer.buyHouse();}
}
//客户端调用
public class client {public static void main(String[] args) {person p = new person();proxy proxy = new proxy(p);proxy.buyHouse();}
}

客户端调用结果:

筛选合适房屋
带看房
私人买房

上述为简单的静态代理,静态代理是代理对象和目标对象都需要实现同一接口。
        优点:可以在不修改目标对象的前提下扩展目标对象的功能。
        缺点:类数量变多了,并且在接口中新增方法,代理对象和目标对象都需要修改,扩展复杂。

JDK动态代理


代码示例

//买房者
public interface Buyer {void buyHouse();
}
//私人
public class person implements Buyer{@Overridepublic void buyHouse() {System.out.println("私人买房");}
}
//反射代理
public class ProxyInvocationHandler<T> implements InvocationHandler {private T target;public ProxyInvocationHandler(T target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("增强功能");// 执行目标对象方法Object returnValue = method.invoke(target, args);return returnValue;}
}
//客户端调用
public class client {public static void main(String[] args) {Buyer p = new person();InvocationHandler proxyFactory = new ProxyInvocationHandler<Buyer>(p);Buyer buyer = (Buyer) Proxy.newProxyInstance(Buyer.class.getClassLoader(), new Class<?>[]{Buyer.class}, proxyFactory);buyer.buyHouse();}
}

客户端调用结果:

增强功能
私人买房

上述则为JDK动态代理,可以发现在目标对象在新增、修改和删除方法时,代理类无需进行任何更改,并且任何的目标对象都可以使用该代理类进行代理,所有被代理方法都会在InvocationHandler中的invoke方法进行统一处理。
    JDK动态代理实现步骤如下:

  1. 存在目标对象和其接口。
  2. 创建InvocationHandler并在其invoke方法中,实现代理增强的逻辑。
  3. 调用Proxy.newProxyInstance方法,传入3个参数,分别是目标对象的接口类加载器,目标对象接口类和InvocationHandler实例。

迷思小贴士:

     JDK动态代理在使用上存在一定的局限性,首先必须要确保被目标对象存在接口,其次被代理的方法只能是在接口中被声明的方法。但JDK动态代理无需引用任何外部依赖,JAVA原生支持。

CGLIB代理

代码示例

//超人(目标对象)无需实现接口
public class SuperPerson {public void buyHouse(){System.out.println("超人买房,不需要接口");}
}
//CGLIB代理类
public class CGProxy implements MethodInterceptor {private Object target;/*** 代理方法,实现增强逻辑*/public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable {System.out.println("增强功能");Object result = proxy.invokeSuper(arg0, arg2);return result;}/*** 获取代理对象*/public Object getProxyObject(Object target) {this.target = target;Enhancer enhancer = new Enhancer();// 设置代理对象enhancer.setSuperclass(this.target.getClass());// 设置回调(在调用父类方法时,回调 this.intercept())enhancer.setCallback(this);// 创建代理对象return enhancer.create();}
}
//客户端调用代理方法
public class Client {public static void main(String[] args) {SuperPerson superPerson = new SuperPerson();    // 被代理的对象// 创建代理对象(创建的代理对象可以放在容器中缓存,后续调用时获取即可)SuperPerson proxyObject = (SuperPerson) new CGProxy().getProxyObject(superPerson);proxyObject.buyHouse();}
}

上述为CGLIB(Code Generation Library),是一个基于ASM的字节码生成库,允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理。CGLIB无需目标对象必须有接口,但需要引入额外的依赖包。代码中MethodInterceptor.intercept对目标对象的方法进行拦截代理,在Enhancer设置目标对象,从中获取到代理对象。

理解设计模式——代理模式相关推荐

  1. 【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸)

    文章目录 什么是代理模式 一. 代理模式简介 二. 静态代理模式 三. 动态代理模式 万能模版 前言:笔记基于狂神设计模式视频.<大话设计模式>观后而写 (最近一直在更新之前的刷题博客,今 ...

  2. 北风设计模式课程---深入理解[代理模式]原理与技术

    北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...

  3. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  4. Android常见设计模式——代理模式(Proxy Pattern)(二)

    文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...

  5. 理解java代理模式

    1.java反射机制 理解代理模式的前提是先理解java中的反射机制,先看一个例子: JDBC加载驱动时,Class.forName("com.mysql.jdbc.Driver" ...

  6. 简说设计模式——代理模式

    一.什么是代理模式 关于代理模式,我们听到的见到的最多的可能就是静态代理.动态代理之类的,当然还有大家都知道的Spring Aop,这里我们先不谈这些个代理,先说个简单的例子.游戏代练应该都听说过,许 ...

  7. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

  8. 设计模式——代理模式

    设计模式--代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 ...

  9. 23种设计模式----------代理模式(一)

    代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...

  10. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

最新文章

  1. plt转pdf软件_无须转Word也能轻松编辑PDF的软件,它来了!
  2. The target you are trying to run requires an OpenSSL implementation.
  3. zabbix安装使用及监控案例(从头到尾)
  4. 【bzoj2423】最长公共子序列[HAOI2010](dp)
  5. 二分搜索之x平方根(保留整数)
  6. Could not delete .........May be locked by another process.
  7. s5pv210——串口(UART)通信实战
  8. 深入理解 LINQ to SQL 生成的 SQL 语句
  9. java foreach6_Java foreach循环是否会创建一个新对象?
  10. 使用 SourceTree 遇到冲突的解决方法
  11. css如何把图片设置成梯形,css实现梯形
  12. Java网络编程(9)NIO - 群聊系统
  13. 毕业设计之---基于java web的停车管理系统
  14. 如何下载网页中加了限制的Flash、RM、WMV等视频文件
  15. 计算机仿真图中的数码管元件库中叫,Multisim仿真软件在电子电路设计中的应用...
  16. 扬州大学计算机科学与技术怎么样,用实力说话!这3所“低调”的大学,有望成为“双一流”建设高校...
  17. 【每天学点Python】案例一:汇率换算
  18. 计算机动画相关论文,计算机动画论文.doc
  19. 微信windows版_安卓首发!微信黑暗模式来了
  20. Xcode:崩溃堆栈符号化,定位崩溃

热门文章

  1. 计算机文化基础说课ppt,计算机文化基础说课 -_图文.ppt
  2. 基于FFT的平面阵列方向图综合
  3. 李想:“做正确的事,不做容易的事”
  4. 旅游系统(SSM框架 结构+效果图)
  5. linux系统支持什么输入法,Linux系统常用输入法框架
  6. Android 修改阿拉伯语数字显示
  7. 第十届全国大学生光电设计大赛分析前瞻(一文看懂光电设计大赛创意赛,做好准备)
  8. Amazon Alexa:未来已来?
  9. FFmpeg采集树莓派USB摄像头(UVC摄像头)
  10. 百人研发团队的难题:研发管理、绩效考核、组织文化和OKR