代理设计模式,是一种常用的设计模式。顾名思义,在面向对象的世界中,就是一个对象对另一个对象的代理。

如现实生活中,处处都是代理,中介是对业主的代理,王婆是对金莲的代理,经纪人至于艺人的代理,销售代理等,当然这是通俗代理。

代理对外是代理对象去交互,但是真正完成工作的,往往又是被代理的对象。例如租房,找中介,但是真正租到的是业主的房子。xxx找王婆,但是最终干活的是金莲。找艺人拍戏,找的是经纪人,但最终拍戏的是艺人等等。

为什么要这样做呢?

对于代理对象,提供比较单一的功能,且可以在代理增加需要的逻辑,却不影响被代理对象。如经纪人帮艺人包装等。

对于被代理对象,控制被代理对象的访问权限,被代理对象只提供部分需要的功能。如中介只代理业主的房子。如果啥都让业主做的话,业主的事情会非常多,而表现在程序上,就是对象的功能非常复杂。

在程序设计模式中,代理模式又可以分为静态代理,动态代理。

静态代理

通过代码来熟悉静态代理,下面是一个静态代理的例子,首先有个IPrettyGirl接口,有三个方法chat,enjoy,sleep三个方法

public interface IPrettyGirl {void chat();void enjoy();void sleep();
}

接口有一个实现

public class JinLian implements IPrettyGirl {@Overridepublic void chat() {System.out.println("to chat with "+this.getClass().getSimpleName());}@Overridepublic void enjoy() {System.out.println("to enjoy with "+this.getClass().getSimpleName());}@Overridepublic void sleep() {System.out.println("to sleep with "+this.getClass().getSimpleName());}
}

有一个代理类Wangpo,代理IPrettyGirl的chat和enjoy方法。毕竟sleep是违法的,不能做这事。

public class WangPo {private IPrettyGirl prettyGirl;public WangPo(IPrettyGirl prettyGirl){this.prettyGirl = prettyGirl;}public void chat(){this.prettyGirl.chat();System.out.println("I am "+this.getClass().getSimpleName()+", I Completed a chat order");}public void enjoy(){this.prettyGirl.enjoy();System.out.println("I am "+this.getClass().getSimpleName()+", I Completed a enjoy order");}
}

这时候大官人要来找乐子了,怎么找呢,不用找金莲,有武松在太危险了,直接找王婆就可以了。

public class XiMenDaGuanRen {public static void main(String[] args) {IPrettyGirl prettyGirl = new JinLian();WangPo wangPo = new WangPo(prettyGirl);wangPo.chat();wangPo.enjoy();}
}

这样就实现了一个经典的静态代理,通过面向接口编程,王婆可以代理所有的漂亮女孩(实现了IPrettyGir接口的对象)。但是为什么是静态代理呢,因为这中代理,要找女孩的话,需要提前的编写代理类去代理IPrettyGirl的对象。这样的话,在某些情况下,也是不方便的。这个时候就需要动态代理了。

动态代理

同样通过代码和实例理解什么是动态代理。西门大官人整天找王婆,难免会让旁人发现问题。但是大官人还是要找乐子,如果自己重新找个代理就好了。这个时候就可以用动态代理,自己创建代理,就可以随时享乐了。

public class XiMenDaGuanRen {public static void main(String[] args) {IPrettyGirl prettyGirl = (IPrettyGirl) Proxy.newProxyInstance(XiMenDaGuanRen.class.getClassLoader(), new Class[]{IPrettyGirl.class}, new ProxyInvocationHandler(new JinLian()));prettyGirl.chat();prettyGirl.enjoy();}
}class ProxyInvocationHandler implements InvocationHandler{private Object object;public ProxyInvocationHandler(Object obj){this.object = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before service");Object obj = method.invoke(this.object, args);System.out.println("after service");return obj;}
}

动态代理有一套特定的API,动态代理不需要编写特定的代理类,可以使用代码动态创建代理类,只需要知道代理类的对象和类型即可。现在对代理,静态代理,动态代理应该有了初步的了解了。

再来看看JDK动态代理涉及到的Java API

Proxy,提供创建动态代理类和对象的静态方法,也是这些方法创建的所有动态代理类的超类。

InvocationHandler,代理类实例的Invocation Handler实现的接口。每一个代理类的实例,都有一个关联的调用处理程序,调用代理实例的invoke方法时,方法调用会被转发到代理实例InvocationHandler来执行。

cglib动态代理

上面这些是JDK的动态代理,第三方库cglib也提供了动态代理的实现方式,再了解一下cglib的动态代理。

通过代码来了解一下,直接看怎么使用cglib实现动态代理。

public class XiMenDaGuanRen {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(JinLian.class);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("before service");Object obj = methodProxy.invokeSuper(o, objects);System.out.println("before service");return obj;}});JinLian jinLian = (JinLian) enhancer.create();jinLian.enjoy();jinLian.chat();}
}

看起来大同小异,cglib的关键api,cglib相比较jdk的动态代理,可以代理类,而jdk只能代理接口。

Enhancer,生成动态子类以实现方法拦截,最初是作为JDK1.3自带动态代理的另外一种支持,带允许扩展具体的基类,也可以实现接口,动态生成的子类,重写父类的非final方法,并回调到用户自定义的拦截器。

MethodInterceptor,方法拦截器,代理类的CallBack实现的接口,代理类的方法调用被转发到回调来执行。

(^_^)

Java设计模式之代理(动态代理,静态代理)相关推荐

  1. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

  2. Java的代理模式之静态代理和动态代理

    文章目录 静态代理 动态代理 jdk生成代理对象 cglib代理 代理模式简介: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目 ...

  3. 【Java】代理模式(静态代理动态代理)

    CONTENT 代理模式 静态代理 动态代理 JDK 动态代理(基于接口) CGLIB 动态代理(基于类继承) JDK 动态代理 v.s. CGLIB 动态代理 JDK 动态代理为什么必须基于接口 R ...

  4. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    Java之代理... 1 一.         概念... 1 二.         jdk的静态代理... 1 三.         jdk动态代理... 4 四.         cglib 动态 ...

  5. 代理详解 静态代理+JDK/CGLIB 动态代理实战

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

  6. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  7. java代理模式之静态代理

    (一)静态代理 1.静态代码模式的介绍 静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类. 2.应用实例 具体要求: 1)定义一个接口:I ...

  8. 代理模式之---静态代理

    代理模式之-静态代理 代理模式:为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 被代 ...

  9. 设计模式之代理模式(上) 静态代理与JDK动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 静态代理 静态代理是由我们编写好的类,在程序运行之前就已 ...

  10. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

最新文章

  1. iOS音频——AudioToolbox
  2. R语言parse函数、deparse函数、expression函数实现字符串和表达式的转换实战
  3. ​2021年机器学习什么风向?谷歌大神Quoc Le:把注意力放在MLP上
  4. mysql中堆和栈_堆和栈的区别
  5. SecureCRT安装的注意事项
  6. 2017c语言预测,2017计算机二级C语言上机最终预测题
  7. HDU 2047 阿牛的EOF牛肉串
  8. 【讨论】新一轮互联网的泡沫即将破灭,大量低级别的码农将被淘汰
  9. lwip+freeRTOS 无法ping通的解决方案
  10. SpringBoot配置RestTemplate的代理和超时时间
  11. 靠自己。linux manul手册入门
  12. win7远程桌面连接问题解决方案
  13. 计算机中常用单位是什么意思,常用单位的换算(含温度、长度、计算机单位、面积以及数量级含义).doc...
  14. 南佛罗里达大学计算机科学硕士,南佛罗里达大学计算机工程理学硕士研究生申请要求及申请材料要求清单...
  15. nginx 代理 负载均衡 网站转接的用法
  16. 计算机启动黑屏时间很长,win10开机后黑屏时间很长且进不了安全模式怎么解决?...
  17. 华为路由器6to4隧道原理及配置
  18. Unity中的热更新 - Lua和C#通信
  19. java读取社保卡_id 社保卡信息读取 使用读卡器对社保卡信息读取 - 下载 - 搜珍网...
  20. python分析b站_实战 | Python模型分析B站优质up主

热门文章

  1. [转载]如何做一个出色的程序员
  2. DrawArc绘制弧线
  3. kafka 分组消费topic_关于kafka更改消费者对应分组下的offset值
  4. pytorch 安卓_兼容PyTorch、TF,史上最灵活Python机器学习框架发布 | 一周AI最火论文...
  5. 用正则将html中的url提取,使用正则表达式从HTML中提取文本和链接
  6. java map遍历_Java中Map集合的两种遍历方式
  7. python中用turtle绘制正方形_在Python-Turtle图形中创建正方形和旋转正方形的简单方法...
  8. linux module 目录,/sys/module/ 模块信息目录与/proc/modules文件
  9. jenkins插件更换源_jenkins快速入门,自动构建一个hello world项目(devops,ci/cd)
  10. APPLE苹果电子设备模型样机|展示你的专业设计最佳选择