代理模式定义
为其它对象提供一种代理以控制对这个对象的访问。
代理模式结构图
代理模式角色介绍
抽象主题角色:Subject,一个普通的业务抽象类或接口。
真实主题角色,RealSubject,它实现了抽象主题角色定义的接口,是业务逻辑的真正执行者。
代理主题角色,Proxy,它和真实主题角色一样,也实现了抽象主题角色定义的接口,但它包含了对真实主题的引用,在任何需要的时候,把请求委托给真实主题角色进行处理;它对真实对象的访问进行控制。
代理模式结构代码
抽象主题:
public abstract class Subject {
public abstract void request();
}
真实主题:
public class RealSubject extends Subject {
public void request() {
System.out.println("i am real");
}
}
代理:
public class Proxy extends Subject {
private Subject realSubject;
public Proxy() {
this.realSubject = new RealSubject();
}
public void request() {
this.before();
realSubject.request();
this.after();
}
private void before(){
System.out.println("i am proxy before");
}
private void after(){
System.out.println("i am proxy after");
}
}
客户端:
public class Client {
public static void main(String[] args) {
Subject subject = new Proxy();
subject.request();
}
}
代理模式运行机制
代理角色和真实主题角色实现共同的抽象主题角色,来达到代理角色替换真实主题角色的目的。
代理角色虽然可以替换真实主题角色,但代理角色通过持有真实主题角色对象,把请求再委托给真实主题角色;通常代理角色委托请求前后会进行相关前置或后置处理,以此达到对真实对象的控制。
代理模式解决的核心问题
代理模式通过共同实现和组合真实对象,实现了对真实对象的控制,相当于真实对象的前置屏障。