1、代理模式

所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要!

上面这个例子,你就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”!

代理模式JAVA代码示例:
 //抽象角色:抽象类或接口

源代码复制打印
  1. interface Business
  2. {
  3. void doAction();
  4. }

//真实角色:真正实现了业务逻辑接口

//代理角色:自己并未实现业务逻辑接口,而是调用真实角色来实现

源代码 复制 打印
  1. class BusinessImplProxy implements Business
  2. {
  3. private BusinessImpl bi;
  4. public void doAction()
  5. {
  6. if (bi==null)
  7. {
  8. bi = new BusinessImpl();
  9. }
  10. doBefore();
  11. bi.doAction();
  12. doAfter();
  13. }
  14. public void doBefore()
  15. {
  16. System.out.println("前置处理!");
  17. }
  18. public void doAfter()
  19. {
  20. System.out.println("后置处理!");
  21. }
  22. }
  23. //测试类
  24. class Test
  25. {
  26. public static void main(String[] args)
  27. {
  28. //引用变量定义为抽象角色类型
  29. Business bi = new BusinessImplProxy();
  30. bi.doAction();
  31. }
  32. }

所以,借助于JVM的支持,可以在运行时动态生成代理类(“代理角色”),我们就可以解决上述代理模式中代码膨胀的问题,使用了动态代理后,“代理角色”将不用手动生成,而由JVM在运行时,通过指定类加载器、接口数组、调用处理程序这3个参数来动态生成。

动态代理模式JAVA代码示例:

源代码复制打印
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Proxy;
  3. import java.lang.reflect.Method;
  4. //抽象角色:java动态代理的实现目前只支持接口,不支持抽象类
  5. interface BusinessFoo
  6. {
  7. void foo();
  8. }
  9. interface BusinessBar
  10. {
  11. String bar(String message);
  12. }
  13. //真实角色:真正实现业务逻辑方法
  14. class BusinessFooImpl implements BusinessFoo
  15. {
  16. public void foo()
  17. {
  18. System.out.println("BusinessFooImpl.foo()");
  19. }
  20. }
  21. class BusinessBarImpl implements BusinessBar
  22. {
  23. public String bar(String message)
  24. {
  25. System.out.println("BusinessBarImpl.bar()");
  26. return message;
  27. }
  28. }
  29. //动态角色:动态生成代理类
  30. class BusinessImplProxy implements InvocationHandler
  31. {
  32. private Object obj;
  33. BusinessImplProxy() {
  34. }
  35. BusinessImplProxy(Object obj) {
  36. this.obj = obj;
  37. }
  38. public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
  39. {
  40. Object result = null;
  41. doBefore();
  42. result = method.invoke(obj,args);
  43. doAfter();
  44. return result;
  45. }
  46. public void doBefore(){
  47. System.out.println("do something before Business Logic");
  48. }
  49. public void doAfter(){
  50. System.out.println("do something after Business Logic");
  51. }
  52. public static Object factory(Object obj)
  53. {
  54. Class cls = obj.getClass();
  55. return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
  56. }
  57. }
  58. //测试类
  59. public class DynamicProxy
  60. {
  61. public static void main(String[] args) throws Throwable
  62. {
  63. BusinessFooImpl bfoo = new BusinessFooImpl();
  64. BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
  65. bf.foo();
  66. System.out.println();
  67. BusinessBarImpl bbar = new BusinessBarImpl();
  68. BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
  69. String message = bb.bar("Hello,World");
  70. System.out.println(message);
  71. }
  72. }

程序流程说明:
       new BusinessFooImpl();创建一个“真实角色”,传递给工厂方法BusinessImplProxy.factory(),进而初始化“调用处理器”——即实现InvocationHandler的类。并返回一个动态创建的代理类实例,由于“代理角色”也必然实现了“抽象角色”提供的业务逻辑方法,故可向下转型为BusinessBar,并赋值给指向BusinessBar类型的引用bb。
       newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法由程序员来指定参数动态返回需要的代理类,而invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用的。当执行“bb.bar("Hello,World");”方法时,JVM动态指派“调用处理器”,向外层invoke传递参数,并调用method.invoke(obj,args)真正执行!

BusinessImplProxy.Factory静态方法用来动态生成代理类(“代理角色”),在运行时根据不同的业务逻辑接口BusinessFoo和BusinessBar,在运行时分别动态生成了代理角色。“抽象角色”、“代理角色”以及调用处理器(实现InvocationHandler接口的类)这三者都可以改变,所以说JAVA的动态代理十分强大。

JAVA代理模式与动态代理模式相关推荐

  1. java动态代理_Java代理模式及动态代理详解

    Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...

  2. Java代理模式及动态代理详解

    本文转自:程序新视界公众号 Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK ...

  3. Java内功修炼系列:代理模式及动态代理

    目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...

  4. Java篇 - 代理模式和动态代理实现原理

    设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...

  5. Java拾遗:007 - 代理模式与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...

  6. 代理模式、动态代理和面向方面

    代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你请来做事的人就是代理.比如过春节要回家,由于你要上班,没时间去 ...

  7. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  8. 代理模式和动态代理模式_代理模式介绍

    代理模式和动态代理模式 代表:被选中或当选为他人投票或代理的人– Merriam-Webster . 委托模式:在软件工程中,委托模式是面向对象编程中的一种设计模式,其中,一个对象而不是执行其陈述的任 ...

  9. 23种设计模式之代理模式(动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的组成 抽 ...

  10. 方法功能增强 - 继承、装饰者模式、动态代理

    引言   方法功能的增强是开发时常做的事情,当官方或者第三方提供的API不能满足我们的需要时,可以在原有API的基础上加上我们自定义的功能来实现需求.   码农阶段需要掌握的功能增强的方式有三种:继承 ...

最新文章

  1. VS.net2008正式版发布了
  2. Appium base knowledge
  3. mysql根据经纬度搜周边_mysql根据经纬度获取附近的商家
  4. 工业以太网交换机出现温度过高如何处理?
  5. linux自学笔记--DNS服务器
  6. paip.PHP-asp—jsp实现事件机制 WEBFORM式开发
  7. STM32学习心得一:FlyMcu软件配置(STM32串口下载软件)
  8. php侧边客服,利用jquery实现网页侧边栏在线客服代码
  9. 使用c语言打印九九乘法表
  10. js pug 代码_pug模板引擎(原jade)
  11. A Little Is Enough: Circumventing Defenses For Distributed Learning(绕过对分布式学习的防御)
  12. 智能红外遥控器(四):手机蓝牙控制格力风扇康佳加湿器
  13. 我与CSDN的2021 --从路人到一名万粉博主的自述
  14. 会计做什么副业好?分享几个适合会计的副业
  15. spring boot 源码解析23-actuate使用及EndPoint解析
  16. FFmpeg提取视频音乐
  17. 排名前6位的最流行的大数据框架,你在用哪一款?
  18. Go:Cos求余弦(附完整源码)
  19. Android开发,你必须知道的四大天王。
  20. [Python] openpyxl读存大数据 Exception: String longer than 32767 characters

热门文章

  1. 带你了解跨站请求伪造(CSRF),具体代码实现
  2. 华为2018优招 解决方案技术工程师
  3. mysql查询专业术语,英文术语MySQL查询
  4. 有效解决应用程序无法正常启动(0xc000007b)的错误
  5. Records of Reinfocement Learning Experiments
  6. 微信企业号开发实例源码
  7. 基于AT89C51单片机的抢答器的设计(数码管:四位一体共阳)
  8. JavaScript代码具体是怎么引入到HTML中的?
  9. 暑假实习 + 提前批 +校园招聘(更新中)
  10. 主流深度学习GPU云平台租赁价格比较表