代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下: Provide a surrogate or placeholder for another object to control access to it. 即:为其他对象提供一种代理以控制对这个对象的访问。
代理模式的通用类图如下图所示:
![](https://img.haomeiwen.com/i53727/d89f681c4798b197.jpg)
代理模式也叫做委托模式,它是一项基本设计技巧,许多模式,如状态模式,策略模式,访问者模式本质上都采用了委托模式。我们先看一下类图中三个角色的定义:
- Subject 抽象业务类。抽象业务类可以是抽象类也可以是接口,是最普通的业务类型定义,无特殊要求。
- RealSubject 具体业务类。也叫做具体被委托类或具体被代理类,是具体业务的执行者。
- Proxy 代理类。也叫做委托类,负责对具体业务的调度,把所有抽象业务类定义的业务方法限制委托给具体业务类,并且在具体业务类的业务方法执行前后进行其他相关操作。
接下来我们看一下代理模式的通用代码:
//抽象业务类
public interface Subject{
//抽象业务方法
public void request();
}
//具体业务类1
public class RealSubject1 implements Subject{
//实现业务方法
@Override
public void request() {
System.out.println("RealSubject 1 业务逻辑处理...");
}
}
//具体业务类2
public class RealSubject2 implements Subject{
//实现业务方法
@Override
public void request() {
System.out.println("RealSubject 2 业务逻辑处理...");
}
}
public class Proxy implements Subject{
//要代理的实现类
private Subject subject = null;
//默认被代理者
public Proxy(){
this.subject = new RealSubject1();
}
//通过构造函数传递代理者
public Proxy(Subject subject) {
this.subject = subject;
}
//实现处理方法
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
//代理预处理
private void before(){
System.out.println("Proxy before...");
}
//代理后处理
private void after(){
System.out.println("Proxy after...");
}
}
public class ProxyClient {
public static void main(String[] args) {
Proxy proxy1 = new Proxy();
Proxy proxy2 = new Proxy(new RealSubject2());
proxy1.request();
System.out.println("---------------------");
proxy2.request();
}
}
通用代码的运行结果如下:
Proxy before...
RealSubject 1 业务逻辑处理...
Proxy after...
---------------------
Proxy before...
RealSubject 2 业务逻辑处理...
Proxy after...
一个代理类可以代理多个被委托者或被代理者,因此一个代理类具体代理那个具体业务类,是由场景决定的。当然,最简单的情况就是一个主题和一个代理类,这是最简洁的代理模式。通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个类由高层决定,也就是代理类构造方法中传递的被代理者。
代理模式的应用
代理模式的优点
- 职责清晰。具体业务类只需要完成实际的业务逻辑,而不用关心其他非本职的事务,通过后期的代理完成一件事务,附带的结果就是编程简介清晰。
- 高扩展性。具体业务类随时都是可以变化的,只要它实现了抽象业务接口,代理类完全可以在不做任何修改的情况下使用。
- 智能化。
代理模式的使用场景
代理模式的使用场景非常多,Spring AOP就是一个典型的动态代理。
《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。
网友评论