本文摘自书籍《设计模式》
结构型 - 代理模式(Proxy Pattern)
定义
给某个对象提供一个代理,并由代理对象控制对源对象的引用。
模式结构
public interface Subject {
void request();
}
public class RealSubject implements Subject {
public void request() {
//逻辑
}
}
public class Proxy implements Subject {
private Subject subject;//RealSubject
...
public void preRequest() {
//前
}
public void request() {
preRequest();
subject.request();
postRequest();
}
public void request() {
//后
}
}
Subject
抽象主题角色,生命了真实主题与代理主题的共同接口,只要可以使用真实主题的地方都可以使用代理主题,客户端需要针对抽象主题角色进行编程。
Proxy
代理主题角色,包含对真实主题的引用。
优点
代理模式的优点:
- 能协调调用者和被调用者,在一定程度上降低了系统的耦合度。
缺点
- 在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理变慢。
- 实现代理模式需要额外的工作,有些代理模式非常复杂。
常见代理分类
根据代理模式的使用目的,代理模式分类:
- 远程代理 — 为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。
- 虚拟代理 — 根据需要将一个资源消耗很大或者比较复杂的对象延迟到真正需要时才创建。比如:如果一个很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,这个大图片可能就影响了文档的阅读,这时需要做个图片Proxy来代替真正的图片。
- 保护代理 — 控制对一个对象的访问权限。比如:在论坛中,不同的身份登陆,拥有的权限是不同的,使用代理模式可以控制权限(当然,使用别的方式也可以实现)。
- 智能引用代理 — 提供目标对象额外的服务。比如:纪录访问的流量(这是个再简单不过的例子),提供一些友情提示等等。
还有部分不常见代理:
- Copy-on-Write 代理 — 是虚拟代理的一种,把复制操作延迟到只有在客户端真正需要时才执行。
- 缓冲代理 — 为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
- 防火墙代理 — 保护目标不让恶意用户接近。
- 同步化代理 — 使几个用户能够同时使用一个对象而没有冲突。
代理的应用
- spring中AOP
- Structs2中拦截器