一、定义
代理模式也叫委托模式,为其它对象提供一种代理以控制对这个对象的访问,它是一项基本设计技巧。许多其他的设计模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,在应用中,代理模式提供非常好的访问控制。在一些著名的开源软件中也经常见到它的身影,如Struts2 的from元素映射就采用了代理模式。
二、代码演示
- 代理模式通用类图
Subject抽象主体角色
抽象主体可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求
public interface Subject {
//定义一个方法
public void request();
}
- RealSubject具体的主体角色
也叫被委托角色、被代理角色。是业务逻辑的具体执行者。
public class RealSubject implements Subject {
//实现方法
public void request(){
//业务逻辑处理
System.out.println("RealSubject 业务逻辑处理");
}
}
- Proxy代理主体角色
也叫做委托类、代理类。他负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主体角色实现,并且在真实主题角色处理完毕前后做预处理和善后工作。
public class Proxy implements Subject {
//要代理的哪个实现类
private Subject subject = null ;
//默认被代理者
public Proxy(){
this.subject = new Proxy();
}
//通过构造函数传递代理者
public Proxy(Object ... objects){
}
public Proxy(Subject _subject){
this.subject = _subject;
}
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
//预处理
public void before(){
System.out.println("预处理");
}
//善后处理
private void after(){
System.out.println("善后处理");
}
}
- 场景类
public class Client {
public static void main(String args[]){
Proxy proxy = new Proxy(new RealSubject());
proxy.request();
}
}
三、优点
- 职责清晰
真正的角色就是实际的业务逻辑,不用关心其他非本职的事务,通过后期代理统一完成事务。 - 高扩展性
具体主题角色是随时可以变化的,只要实现了接口,那代理类完全不用做任何修改。
四、缺点
五、应用场景
代理模式的使用场景非常多,可以看看Spring AOP ,是一个非常典型的动态代理。
六、注意事项