代理模式

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

代理模式是一个使用率非常高的模式,为其他对象提供一种代理以控制这个对象的访问。代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式策略模式访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。

代理模式类图

代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问;

抽象主题类Subject通过接口抽象类声明真实主题代理对象实现的业务方法:

1
2
3
public interface Subject {
void request();
}

真实主题类RealSubject实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象,为具体主题角色,也叫被委托角色被代理角色,是业务逻辑的具体执行者

1
2
3
4
5
6
public class RealSubject implements Subject {
@Override
public void request() {
// 业务逻辑处理
}
}

代理类Proxy提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问控制扩展真实主题的功能,也叫委托类代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Proxy implements Subject {
private Subject subject;
public Proxy(Subject subject) {
this.subject = subject;
}
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
private void before() {}
private void after() {}
}

一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知;一个代理类可以代理多个被委托者或被代理者, 因此一个代理类具体代理哪个真实主题角色, 是由场景类决定。

代理模式优点职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务;高扩展性智能化

根据代理的创建时期,代理模式分为静态代理动态代理,还可以通过反射的方式实现动态代理

优点

在客户端与目标对象之间起到一个中介作用和保护目标对象的作用

可以扩展目标对象的功能

能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

缺点

会造成系统设计中类的数量增加

在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢

增加了系统的复杂度

应用场景

当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:保护目标对象增强目标对象

  • 远程代理,通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。
  • 虚拟代理,通常用于要创建的目标对象开销很大时。
  • 安全代理,通常用于控制不同种类客户对真实对象的访问权限。
  • 智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。
  • 延迟加载,指为了提高系统的性能,延迟对目标的加载。