“代理”这个词这几年可谓是家喻户晓了,对于“代理模式”我们也可以通过代购的逻辑来进行理解。

本期干货文章,我们来聊聊编程中GOF23种经典模式之一的“代理模式”,这里以java语言为例进行讲解。

1. 代理模式Proxy

代理模式是一种结构型设计模式,是开发中最常用的设计模式之一。

它是这样来定义的:为其他对象提供一种代理以控制对这个对象的访问。

代理模式主要用来解决:在直接访问对象时带来的一些问题,比如:我们需要为一个业务方法在执行前后记录日志,为了达到解耦的目的,我们就需要创建一个代理类来完成既可以调用原业务方法,又可以在调用前后进行日志处理。

代理模式的使用场景:在我们开发中非常的多,比如Spring容器的延迟加载,AOP增强处理、日志处理等。

代理模式的角色:

抽象角色: 通过接口或抽象类声明真实角色需要被代理的业务方法。

委托角色(真实角色): 被代理的对象,需要实现抽象角色中业务方法这样才会被代理业务方法。

代理角色:实现抽象角色,是真实角色的代理,通过实现抽象角色可以在真实角色实现业务的基础上添加增强功能和业务。

代理模式分类

●静态代理

●动态代理

2. 静态代理

静态代理就是由程序员创建或工具生成代理类的代码,再对其进行编译。

之所以叫静态代理是因为在程序运行之前我们代理类的.class文件就已经存在了,代理类和委托类(真实角色)的关系和方法增强在程序运行前就已经确定了。

下面我们通过之前说的添加日志业务为例,来看下静态代理的实现:

抽象角色:

委托角色:

代理角色:

静态代理的使用:

分析:

静态代理的特点就是在不影响真实角色业务方法的基础上进行了方法的增强,完成了业务和增强的解耦。

缺点是代理类和委托类实现了相同的抽象接口,这样不仅造成了代码的重复——以后我们想要新增一个业务方法的时候,代理类和委托类代码改动的也比较大,而且一个代理类也只能代理一种类型的对象,如果想要代理其他类型的对象又需要按照我们上面写的一套重新写一套。

为了解决静态代理的缺点,于是java中就出现了动态代理模式。

3. 动态代理

动态代理是在程序运行期间,由JVM通过反射机制或者修改字节码技术实现生成代理类对象,在实现阶段我们不用关心代理类,而在运行阶段才指定哪一个对象,因为这里的代理类不是由程序员编写的而是由系统动态生成的所以叫动态代理。

Java中动态代理的实现方式主要有两种:

● JDK动态代理

JDK动态代理是利用反射机制在程序运行过程中生成代理对象,JDK的动态代理只能代理实现了接口的类。

● CGLib动态代理

CGLib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。可以代理没有实现接口的类。

这两种动态代理的实现方式其实也是java经典框架spring里面使用的两种方式。

因为JDK动态代理是由JDK提供的所以我们可以直接使用,而CGLib是第三方开源的需要下载和导入第三方的jar包或者依赖,所以这里我们主要讲解JDK动态代理的实现。

JDK动态代理实现:

JDK动态代理实现步骤:

(1) 创建一个实现接口InvocationHandler的类;

(2) 在自定义InvocationHandler实现类中调用Proxy的newProxyInstance静态方法,创建一个代理类。

(3) 重新实现类的invoke方法,添加增强功能。

(4) 通过代理对象调用目标方法。

代码实现:

我们的抽象接口UserService和为拖累UserServiceImp还是不变,下面我们只需要完成InvocationHandler实现类即可。

动态代理的使用:

分析:

动态代理与静态代理相比较,最大的好处就是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理                                      (InvocationHandler.invoke)。

这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强。

代理模式:先生需要代购吗?相关推荐

  1. 听说,代理模式真的只是个搞代购的?

    存在即合理 总有些东西是值得研究研究的,虽然我对设计模式也不是很懂,但是学习研究了一下还是觉得受益匪浅的. 我们学习每一个知识点的时候都希望能一下子就能领悟,能吸收成为自己所用的技能.当然这也因人而异 ...

  2. JAVA设计模式(09):结构型-代理模式(Proxy)

    代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...

  3. 设计模式之代理模式学习笔记

    前言 代理模式,也叫做委托模式.就好比请律师打官司一样,为其他对象提供一种代理,来控制对这个对象的访问. 结构图 接下来我们对以上结构图拆解,进行角色分析: 1.Subject:抽象主题类,声明真实主 ...

  4. 代理模式详解(静态代理和动态代理的区别以及联系)

    原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见.比如说在携程上定火车票,携程在这里就起到了一个代理 ...

  5. 通俗易懂设计模式解析——代理模式

    前言 今天讲的是结构型设计模式中的最后一个,这个模式也就是代理模式,在前段时间我写的一篇关于正向代理和反向代理的文章.虽说此代理非彼代理.但是代理一词还是具有相似的含义的.这里我们继续使用文章中的代购 ...

  6. [oc学习日记]代理模式

    何为代理模式,代理模式也成委托模式 代理模式顾名思义,就是一个人让另一个个人帮助他做某事 我们下面就用一个代购的故事为大家讲解代理模式 1.首先我们要创建一个协议,该协议具有具体功能(代购的功能) 1 ...

  7. 代理模式(Proxy)--静态代理

    1,代理模式的概念 代理模式:为其他对象提供一种代理,以控制对这个对象的访问(代理对对象起到中介的作用,可去掉功能服务或者添加额外的服务) 2,代理模式的分类 (1)远程代理:类似于客户机服务器模式 ...

  8. JAVA设计模式理解与总结(下)代理模式适配器模式观察者模式

    码了好几年代码的打字机器我,对于设计模式这个词,肯定是一点也不陌生,但是对于设计模式的理解,因为日常开发中,增删改查较多,使用设计模式思想来优化代码的机会就很少.也不乏在翻阅源码的时候,叹服于别人优秀 ...

  9. Java 设计模式(十三):代理模式

    参考链接:代理模式-Proxy Pattern 近年来,代购已逐步成为电子商务的一个重要分支.代购简单来说就是找人帮忙购买所需要的商品,代购网站就是其中一种产物,它为消费者提供在线的代购服务,如果看中 ...

最新文章

  1. Objective-C学习笔记2013[NSString]字符串[可变字符串中,加用app减用delete]
  2. 9.Tornado下的一个简易Blog--2013-05-21
  3. [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵
  4. C++11 多线程相关知识的学习
  5. mysql linux 还原_linux下java还原mysql数据库
  6. mysql like 多个条件_千万级MySQL数据库这样建索引可以让你的数据库飞起来.........
  7. flask 上传excel 前端_flask-restful编写上传图片api
  8. Node.js: exports 和 module.exports 的区别
  9. Nginx + IIS实现负载均衡 Session多站点共享
  10. 正则表达式 re模块
  11. c语言单词的一个字母变换,c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串知道...
  12. Struts2学习笔记(十八) 防止表单重复提交
  13. 毕业5年决定人的一生-- 大家千万不要错过这篇文章
  14. 手机4k屏幕测试软件,手机4K屏、2K屏、1080p屏对比测试!惊叹
  15. access转换MySQL教程,如何将Access数据库转换为SQL Server
  16. SPSS学习(二)作图
  17. 日文配列键盘修改和映射自定义
  18. 在操作系统、芯片领域跌倒的中国程序员,如何崛起?
  19. Ant是什么东西(初级)
  20. 贪心 csust1250 绮礼的阴谋

热门文章

  1. 收到苹果Notice of Termination 邮件之后
  2. 解决 LaTeX 索引的路径中存在波浪号的问题
  3. 微博粉丝服务---“公众号”开发
  4. 设计模式之适配器模式、委派模式、访问者模式、工厂模式、桥接模式(双维度扩展)
  5. 一年学完mit计算机课程,一年学完MIT四年课程的学霸教你引爆学习力
  6. 深度学习入门(上)01(用cifar数据实现三层网络实现图片分类)
  7. bootstrap-table+Django: 服务端分页
  8. 小飞鱼通达二开 软件版权登记之自己动手写一个源代码文档生成器(图文)
  9. Js实现数字动态滚动效果
  10. 软件测试缺陷等级划分_缺陷BUG等级定义?都分为那些级别