“代理”这个词这几年可谓是家喻户晓了,原因呢就是被微信好友或者朋友圈各种商品“代购”经常的刷屏!从此代理商或者代购这个新职业也进入了人们的眼中。

那么理解“代理模式”可以通过买东西代购来理解它,我们知道我们日常生活中需要的东西很多,有的一些甚至是一些国外大牌商品,有的时候我们需要购买他们的最新商品或者干脆就是国内商品短缺我们想要购买到商品怎么办呢?没错就是通过代购了,通过代购我们不需要亲自跑到国外的某个城市某个商店、也不需要关注如何拿到货之类的问题,我们只需要把钱给代购让他们直接帮我们拿到商品就行了,这样的模式其实就是“代理模式”了。

下面我们就来聊聊编程中GOF23种经典模式之一的代理模式,这里以java语言为例介绍。

  1. 代理模式Proxy

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

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

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

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

代理模式的角色:

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

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

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

代理模式分类:

l静态代理

l动态代理

  1. 静态代理

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

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

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

分析:静态代理的特点就是在不影响真实角色业务方法的基础上进行了方法的增强,完成了业务和增强的解耦。缺点是代理类和委托类实现了相同的抽象接口,这样不仅会造成了代码的重复以后我们想要新增一个业务方法的时候,代理类和委托类代码改动的也比较大,并且一个代理类也只能代理一种类型的对象,如果想要代理其他类型的对象又需要按照我们上面写的一套重新写一套。

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

  1. 动态代理

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

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

lJDK动态代理

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

lCGLib动态代理

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

以上就是代理模式的实现了。

Java开发篇——设计模式(4)先生需要代购吗?相关推荐

  1. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  2. Java基础篇--设计模式

    目录 前言 设计模式 创建型模式 单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式 结构型模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 亨元模式 代理模式 行为型模式: 访问者模 ...

  3. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  4. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  5. Java进阶篇设计模式之十三——观察者模式和空对象模式

    简介 观察者模式又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. ...

  6. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  7. Java进阶篇设计模式之一 ----- 单例模式

    前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...

  8. 【Java开发】设计模式 19:观察者模式

    1 观察者模式介绍 备忘录模式是一种行为型设计模式,用于在对象之间建立一对多的依赖关系,使得当某个对象状态发生改变时,其相关依赖者都能够收到通知并自动更新. 在该模式中,被观察者对象维护着一份观察者列 ...

  9. 【Java开发】设计模式 17:中介者模式

    1 中介者模式介绍 中介者模式是一种行为设计模式,指用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.在这个模式中,中介者 ...

最新文章

  1. Splunk 会议回想: 大数据的关键是机器学习
  2. [转]一个典型的软件项目的WBS评析
  3. webpack+vue搭建基础
  4. 一个完整的iOS开发框架(Frameworks)-NimbusKit
  5. mysql中的表连接知识点_Mysql知识点总结
  6. 大厂竟然都是这么做系统监控的,我们的方式太原始了~
  7. maven使用小技巧 optional
  8. python date time
  9. 【转】SAP S4 OP/Cloud 10个区别
  10. python 位置参数、默认参数、可变参数位置关系_python的位置参数、默认参数、关键字参数、可变参数区别...
  11. 在哪里可以运行EJB?
  12. 【版本发布】JEECG 3.6.2 移动能力版发布,快速开发平台
  13. 几种常见的长度单位整理
  14. new string(abc)创建了几个对象_面试题系列第2篇:new String()创建几个对象?有你不知道的...
  15. 【二分图】【最大匹配】【匈牙利算法】CODEVS 2776 寻找代表元
  16. Springboot JpaRepository findOne() 方法报错
  17. 基于Monorail的系统功能模块化
  18. 如何选择一款好的倾斜摄影相机
  19. 你能发现什么?又能坚持什么?
  20. Axure RP 9笔记

热门文章

  1. 在iOS上浏览Instagram的全新方式 - Gramatica
  2. 在ubuntu上使用v4l2loopback和ffmpeg模拟摄像头
  3. RK3399开发板AI人工智能深度学习之TensorFlow 测试
  4. 云服务器和虚拟主机有什么区别?
  5. 任命一位国家首席技术官
  6. 数据库创建索引和删除索引的方式总结
  7. DVWA通关攻略(适合新手)
  8. Pycharm恢复 还原 默认视图
  9. Chrome插件开发实战
  10. php怎么取整数,js怎么取整数