代理模式
共同接口或抽象类
目标类
代理类,代理类里含有目标类的对象,而在调用目标对象的方法前后,代理类可以添加额外的逻辑
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代理是基于继承的代理,它是继承了目标类,即生成了目标的子类来实现代理,可以重写目标方法,在重写的方法中插入格外 的逻辑