练习源码:https://github.com/liaoooyx/Design-Patterns
代理模式中的静态代理和装饰器模式、适配器模式中的对象适配器类似,都是使用了组合的方式。
区别在于,代理模式主要是起到增强方法和权限拦截的作用。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务,然后在业务功能执行的前后加入一些公共的服务。
静态代理
参考:设计模式—代理模式、23种设计模式全解析
public class SourceProxy implements Sourceable {
private Source source; //委托类,同样实现了Sourceable接口
public SourceProxy(){
super();
this.source = new Source();
}
@Override
public void method() {
before();
source.method();
atfer();
}
private void atfer() {
System.out.println("after proxy!");
}
private void before() {
System.out.println("before proxy!");
}
}
JDK动态代理
关于实现:设计模式之—代理模式(AOP的原理)、设计模式—代理模式
关于动态代理:java的动态代理机制详解、深入理解JDK动态代理机制
简单来说,就是用实现了InvocationHandler
的实现类,代替了上述静态代理中的SourceProxy
类。然后通过Java提供的反射技术:Proxy.newProxyInstance()
创建对象,上转型为接口的类型,然后通过接口引用,调用方法。
Interface interface = (Interface) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
concreteClass.getClass().getInterfaces(),
handler);
interface.method();
cglib动态代理
参考:深入理解CGLIB动态代理机制
动态代理要求被代理的类必须实现接口。而CGLIB动态代理则没有此类强制性要求。
CGLIB创建的动态代理对象比JDK创建的动态代理对象的性能更高,但是CGLIB创建代理对象时所花费的时间却比JDK多得多。所以对于单例的对象,因为无需频繁创建对象,用CGLIB合适,反之使用JDK方式要更为合适一些。同时由于CGLib由于是采用动态创建子类的方法,对于final修饰的方法无法进行代理。(设计模式—代理模式)