代理模式

  1. 共同接口或抽象类

  2. 目标类

  3. 代理类,代理类里含有目标类的对象,而在调用目标对象的方法前后,代理类可以添加额外的逻辑

  4. Client类,去调用代理类

静态代理

 //共同接口或者抽象类
 public interface SellTickets {
     void sell();
  }
  //目标类
 public class TrainStation implements SellTickets {
     public void sell() {
         System.out.println("火车站卖票");
     }
  }
 //代理类
 //在调用目标对象的方法之前或之后,代理类可以添加额外的逻辑
 public class ProxyPoint implements SellTickets {
     private TrainStation station = new TrainStation();
     public void sell() {
         System.out.println("代理点收取一些服务费用");//格外的东东
         station.sell();
     }
  }
  //测试类
 public class Client {
     public static void main(String[] args) {
         ProxyPoint pp = new ProxyPoint();
         pp.sell();
     }
  }

这样就实现了在不修改原始代码的情况下,对其进行扩展和增强

但是,一个目标类就会产生一个代理类,代码量翻倍,且容易产生类爆炸的情况

动态代理

动态代理和静态代理的All角色一样

动态代理的代理类是动态生成的,不是像静态代理那样写好的

动态代理分为两者:一种是基于接口的(最经典的就是JDK动态代理),一种是基于类的(最经典的就是cglib)

JDK代理和CGlib代理的区别:

JDK代理是基于接口的代理,JDK代理类要求和目标类实现同一个接口,然后在代理类中持有目标类的对象(也叫做代理对象),

而CGLib代理是基于继承的代理,它是继承了目标类,即生成了目标的子类来实现代理,可以重写目标方法,在重写的方法中插入格外 的逻辑

比较是偷走幸福的小偷