[设计模式] 结构型 | 7.代理模式
1.模式定义
- 代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用
- 对象结构型模式
- 代理对象可以在客户端和目标对象之间起到中介的作用
- 通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外的新服务
2.模式结构
代理模式包含如下角色:
- Subject: 抽象主题角色
- Proxy: 代理主题角色
- RealSubject: 真实主题角色
(动态代理跟静态代理的区别就是,静态代理中,proxy是自己写的,动态代理中,proxy是调用jdk生成的)
3.模式分析
代理类示例代码:
public class Proxy extends Subject {
private RealSubject realSubject = new RealSubject(); //维持一个对真实主题对象的引用
public void preRequest() {
…...
}
public void request() {
preRequest();
realSubject.request(); //调用真实主题对象的方法
postRequest();
}
public void postRequest() {
……
}
}
代理模式的类型:
- 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使(Ambassador)
- 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建
- 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限
- 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
- 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等
4. 模式实例
论坛权限控制代理:实例说明
-
在一个论坛中已注册用户和游客的权限不同,已注册的用户拥有发帖、修改自己的注册信息、修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。使用代理模式来设计该权限管理模块。
-
在本实例中我们使用代理模式中的保护代理,该代理用于控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
论坛权限控制代理:参考类图
5.模式优缺点
优点:
- 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
- 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性
- 远程代理:可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高了系统的整体运行效率
- 虚拟代理:通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销
- 缓冲代理:为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间
- 保护代理:可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限
缺点:
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢(例如保护代理)
- 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂(例如远程代理)
6.使用场景
- 当需要在不修改已有源码的基础上,实现新的业务逻辑时可以考虑使用代理模式
- 如果你希望对象的所有方法执行前或执行后都做需要完成某些规定的动作时,你可以考虑使用动态代理。
7.拓展
基于JDK的动态代理实现步:
第一步,创建一个接口(abstractSubject)
第二步,创建实现abstractSubject接口的类(realSubject)
第三步,创建实现InvocationHandler接口的类,在invoke方法中实现业务代理
第四步,利用Proxy类提供的静态工厂方法创建代理类(Proxy)。
第五步,通过代理类调用接口定义的方法。