代理模式定义
客户端想访问目标对象,为了控制客户端对目标对象的访问权限,还是由于目标对象存在多个,统一一种对目标对象的使用方式,所以在客户端和目标对象之间多了一个代理类。用代理类控制客户端对目标对象的访问。
代理模式的好处
1.可以控制对目标对象的访问权限,保证目标对象对客户端是透明的。
2.要是有多个目标对象的话,可以统一对目标对象的访问模式,客户端不需要提供对目标的多种处理方式,例如代理类利用反射就可以处理多种目标类,而只需要给客户端提供一种访问方式就行。
代理模式的主要类
被代理对象:客户端希望调用的对象,客户端想获取这个对象的信息或者想调用这个对象的某个功能。
代理对象:处在客户端和被代理对象之间,可以对被代理对象的访问做出控制,也可以对被代理对象的方法做一些额外处理。
客户端:请求的发起者,想访问被代理对象,但是需要经过代理对象。
抽象类:在静态代理和JDK动态代理中需要有一个被代理对象和代理对象都实现的接口。
代理模式分类
代理模式又分为动态代理和静态代理,动态代理又分为JDK代理和CGLIB代理,JDK动态代理需要被代理对象实现了接口,因为JDK动态代理锁创建的代理对象也要实现和被代理对象同样的接口,并重写接口方法,在接口方法中调用代理处理器来处理,代理处理器会用反射来调用被代理对象的相关方法。CGLIB动态代理会利用字节码形成一个新的class,这个class是继承被代理对象,并重写了被代理对象的相关方法,所以利用CGLIB动态代理功能的类不能是final类型的。
动态代理更加灵活,静态代理的效率会更高一些,但是静态代理每一个被代理对象都需要创建一个代理对象,增加了维护和开发成本。
静态代理是在编码的时候就已经形成的代理,
代理模式结构图
静态代理模式结构图
/**
*
* @ClassName: TrainTicket
* @Description: 抽象主题:火车票
* @author: ljx
* @date: 2019年2月28日 下午4:35:15
*/
public interface TrainTicket {
public void buyTrainTicket();
}
/**
*
* @ClassName: RealTrainTicket
* @Description: 真实主题:购买火车票
* @author: ljx
* @date: 2019年2月28日 下午4:41:08
*/
public class RealTrainTicket implements TrainTicket {
@Override
public void buyTrainTicket() {
System.out.println("购买火车票");
}
}
/**
*
* @ClassName: ProxyTrainTicket
* @Description: 代理
* @author: ljx
* @date: 2019年2月28日 下午4:41:48
*/
public class ProxyTrainTicket implements TrainTicket{
private RealTrainTicket realTrainTicket;
public ProxyTrainTicket(RealTrainTicket realTrainTicket) {
this.realTrainTicket = realTrainTicket;
}
@Override
public void buyTrainTicket() {
proxy12306Start();
realTrainTicket.buyTrainTicket();
proxy12306End();
}
public void proxy12306Start(){
System.out.println("12306代购票开始");
}
public void proxy12306End(){
System.out.println("12306代购票结束");
}
}
//测试
public class ProxyTest {
public static void main(String[] args) {
TrainTicket t = new ProxyTrainTicket(new RealTrainTicket());
t.buyTrainTicket();
}
}
设计模式系列文章有点不想写,虽然有多一部分都是照着别人抄的,但还是不想写了,有点想看其他知识点了,后面还有单例模式,工厂模式,观察者模式就先放一放了。这个设计模式算是补四年前被中断了设计模式系列吧。其实我觉得设计模式在开发中刚开发一个需求是很少被动到的,除非你对这个需求模式特别熟悉,你一开始就能想到用什么设计模式,如果是一个不太熟悉的需求,当你做完,然后再进行优化的时候,可能你就会发现那些地方需要优化就可以用到设计模式了。