随笔分类
代理模式
Proxy模式
结构型模式之一
十分简单
为其他对象提供一种代理(Proxy)以来控制对这个对象的访问
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口或类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理
实现
public interface Subject {
void sellBook();
}
public class RealSubject implements Subject{
@Override
public void sellBook() {
System.out.println("卖书");
}
}
public class Proxy implements Subject{
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
private RealSubject realSubject;
@Override
public void sellBook() { //在交互前后进行某些特殊处理
discount();
realSubject.sellBook();
coupon();
}
public void discount(){
System.out.println("打折");
}
public void coupon(){
System.out.println("购后优惠劵赠送");
}
}
/**
* 运行结果
* 打折
* 卖书
* 购后优惠劵赠送
*/
public class MainClass {
public static void main(String[] args) {
Proxy proxy = new Proxy(new RealSubject());
proxy.sellBook();
}
}
其实这只是最基本的代理模式
代理模式其实分很多种,静态代理,动态代理(JDK动态代理和cglib的动态代理)
这里讲的很浅
之后会有补充
分析
为什么要用代理模式?
-
中介隔离作用
在某些情况下,一个客户类不想或不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是和代理类和委托类实现相同的接口
-
开闭原则,增加功能
代理类是除了客户类和委托类的中介之外,我们还可以通过给代理类添加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不再需要去修改委托类,符合代码设计的开闭原则。代理类主要负责委托类预处理信息、过滤信息、把信息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是通过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是有委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以调用代理类来完成,而没必要打开已经封装好了的委托类