java设计模式——代理模式

Posted MichaelKai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式——代理模式相关的知识,希望对你有一定的参考价值。

一. 定义与类型

定义:为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介作用

类型:结构性。

二. 使用场景

(1)  保护目标对象

(2)  增强目标对象

三. 优缺点

优点:

  (1)  代理模式能将代理对象与真实被调用的目标对象分离

  (2)  一定程度上降低了系统的耦合性,扩展性好

  (3) 保护目标对象

  (4) 增强目标对象

缺点:

  (1) 代理模式会造成系统设计中类的数目增加

  (2) 客户端和目标对象增加一个代理对象,会造成请求处理速度变慢

  (3) 增加系统的复杂度

四. 代理—扩展

静态代理:通过在代码中显示的定义了一个业务实现类的代理类,在代理类中对同名的方法进行包装,再用户通过调用代理类的被包装过的业务方法,来调用目标对象的业务方法,同时进行增强。

动态代理:JDK中的动态代理只能对接口代理,无法代理类。而且用到的代理类,是在程序调用到代理类对象时,才由jvm真正创建。JVM根据传进来的业务实现类对象以及方法名动态的创建了一个代理类的class文件,并且这个class文件被字节码引擎执行,然后通过该代理类的对象进行方法调用。

CGLib代理:可以代理类。原理是生成一个可以被代理的类的子类,重写覆盖其中的方法

五. Spring代理选择—扩展

(1) 当Bean有实现接口时,Spring就会用JDK的动态代理

(2) 当Bean没有实现接口时,Spring使用CGlib

(3) 可以强制使用CGlib

  在Spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

六. 代理速度对比—扩展

CGLib:原理采用ASM字节码生成的,比使用java反射效率高,但是要注意final关键词。

与JDK动态代理相比,在万次实现效果下jdk7与jdk8的动态代理要比CGlib代理速度更快,

七. 相关设计模式

代理模式和装饰者模式

  装饰者模式是给对象加上行为,而代理模式是控制访问,更注重通过设置代理人的方式来增加目标对象,一般是增强目标对象的某些行为。

代理模式和适配器模式

  适配器模式主要改变所考虑对象的接口,而代理模式是不能改变所代理类的接口

八. Coding


以上是关于java设计模式——代理模式的主要内容,如果未能解决你的问题,请参考以下文章

有关java的动态代理和代理模式

Java 之 设计模式——代理模式

java设计模式6——代理模式

Java设计模式----代理模式

java代码实现设计模式之代理模式

Java设计模式——代理模式