代理模式:对其他对象提供一种代理,来控制对这个对象的访问
分类:
静态代理与动态代理(JDK动态代理和cglib动态代理)
优点:
- 职责清晰 真实角色只需关注业务逻辑的实现,非业务逻辑部分,后期通过代理类完成即可。
- 高扩展性 不管真实角色如何变化,由于接口是固定的,代理类无需做任何改动。
缺点:
- 很明显的一点就是反射机制,没有高安全性,性能也相对来讲低一些。
使用场景
(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。
(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。
(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
一、静态代理:
静态代理就是在程序运行前就已经确定代理类与代理对象的代理模式
二、动态代理
1、JDK动态代理
核心:实现核心接口InvocationHandler(拦截器类)
创建代理:
//真实对象的类加载器、真实对象的所有接口 、代理对象
Object o = Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
this);
注意:JDK动态代理是代理的接口,因此强制转换应该转换为接口,而不是实现类,若强制转换实现类就会抛出ClassCastException,好比ArrayList与LinkedList实现统一接口List,两者也不能相互转换,但都可以向上转型。
2、cglib动态代理
cglib动态代理是web应用框架常用的一种动态代理方式。cglib是动态生成被代理类的子类,注意:是子类。
jdk和cglib的2种区别:
首先从文件数上来说,cglib比jdk实现的少了个接口类。因为cglib返回的代理对象是目标对象的子类。而jdk产生的代理对象和目标对象都实现了一个公共接口。