一、定义
为其他对象提供一种代理以控制对这个对象的访问。
也叫委托模式,是一项基本设计技巧。
二、通用代码
- 抽象主题类
可以是接口,也可以是抽象类,该类是一个最普通的业务类型定义,无特殊要求
public interface Subject{
//定义一个方法
public void request();
}
- 真实主题类
也就是具体主题角色,也被叫做被委托角色,被代理角色
public class RealSubject implements Subject{
//实现方法
public void request(){
//业务逻辑处理
}
}
- 代理类 也叫做委托类、代理类。负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
public class Proxy implements Subject{
//需要代理哪个实现类
private Subject subject = null;
//被代理者,可自行默认,也可让场景类写入
public Proxy(){
this.subject = new RealSubject();
}
public Proxy(Subject _subject){
this.subject = _subject
}
public void request(){
this.before();
this.subject.request();
this.after();
}
public void before(){
//预处理
}
public void after(){
//善后处理
}
}
- 场景类
public class Client{
public static void main(String[] args){
Subject proxy = new Proxy();
proxy.request();
Subject subject2 = new RealSubject();
Subject proxy2 = new Proxy(subject2);
proxy2.request();
}
}
三、优点
- 职责清晰
- 高扩展性
- 智能化
四、使用场景
- Spring Aop
五、扩展
-
普通代理
- 需要知道代理的存在,才可以访问
- 客户端只能访问代理角色,不能访问真实角色
- 适合对扩展性要求较高的场合
-
强制代理
- 调用者直接调用真实角色
- 强制调用者使用真实角色指定的代理
-
代理类拥有自己的个性
- 代理类可以为真实角色预处理消息、过滤消息、消息转发、事后处理消息等功能
- 一个代理类可以代理多个真实角色
-
动态代理
- 面向切面编程
- 动态代理者实现被代理者的所有接口,初始默认返回值为空
- 可以在不改变原代码结构的情况下增强或控制对象的行为