代理模式
什么是代理模式?
Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。) 代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。
通用代码
public interface Subject {
/**
* 定义一个方法
*/
public void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
}
}
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
//通过构造函数传递代理者
public Proxy(Object... objects) {
}
//实现接口中定义的方法
@Override
public void request() {
this.before();
this.realSubject.request();
this.after();
}
//预处理
private void before() { //do something
}
// 善后处理
private void after() { //do something
}
}
代理模式的优点
- 职责清晰 :真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
- 高扩展性 :具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。
- 智能化 :这在我们以上的讲解中还没有体现出来,不过在我们以下的动态代理章节中你就会看到 代理的智能化有兴趣的读者也可以看看Struts是如何把表单元素映射到对象上的。
代理模式的使用场景
我相信第一次接触到代理模式的读者肯定很郁闷,为什么要用代理呀?想想现实世界 吧,打官司为什么要找个律师?因为你不想参与中间过程的是是非非,只要完成自己的答辩 就成,其他的比如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。代理模 式的使用场景非常多,大家可以看看Spring AOP,这是一个非常典型的动态代理。