总则
- 设计原则:体现功能复用
- 常用场景:需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作,假设这些类有一致的接口,可使用JDK的动态代理,否则可使用cglib
- 使用概率:99.99999%
- 复杂度:中高
- 变化点:静态代理没有变化点,动态代理的变化点为具有相同切入点的类
- 选择关键点:静态代理选择的关键点是是否要复用被代理的部分功能,动态代理选择的关键点在于能否在将被代理的这一批类当中,找出相同的切入点
- 逆鳞:切入点的不稳定
- 相关设计模式
- 适配器模式:对于适配器模式当中的定制适配器,它与静态代理有着相似的部分,二者都有复用功能的作用,不同的是,静态代理会修改一部分原有的功能,而适配器往往是全部复用,而且在复用的同时,适配器还会将复用的类适配一个接口
代理模式
public interface Subject {
public void buyMac();
}
public class RealSubject implement Subject{
@Override
public void buyMac() {
System.out.println(”买一台Mac“);
}
}
public class Proxy implements Subject{
@Override
public void buyMac{
//引用并创建真实对象实例,即”我“
RealSubject realSubject = new RealSubject();
//调用真实对象的方法,进行代理购买Mac
realSubject.buyMac();
//代理对象额外做的操作
this.WrapMac();
}
public void WrapMac(){
System.out.println(”用盒子包装好Mac“);
}
}
public static void main(String[] args){
//隐藏了细节
Subject proxy = new Proxy();
proxy.buyMac();
}