软件体系结构-代理模式
软件体系结构-代理模式
定义
给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
UML类图
三个部分:Subject(抽象主题角色)、Proxy(代理主题角色)、RealSubject(真实主题角色)
代码
抽象主题角色:
1 | public abstract class Subject{ |
代理主题角色:
1 | public class Proxy extends Subject{ |
真实主题角色:
1 | public class RealSubject extends Subject{ |
各种代理模式
远程代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中,远程代理又称为大使(Ambassador)
**虚拟代理:**如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建(快捷方式)
**保护代理:**控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限
**缓冲代理:**为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
**智能引用代理:**当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等
**动态代理:**可以让系统在运行时根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法(Java通过反射机制来实现)
代理模式、外观模式、适配器模式的区别
代理模式的主要功能是控制
代理模式 VS 外观模式:外观模式为客户端隐藏了系统的复杂性,外观类可以按序调用多个子系统;代理模式则是控制客户端对被代理类的访问,一般用一个代理主题角色对应一个真实主题角色。
代理模式 VS 适配器模式:适配器模式将一个接口转换成客户端希望的接口,解决接口不兼容的问题,代理模式不改变被代理类的接口,仅仅控制客户端对真实主题角色的访问
优点
- 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
- 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性
- **远程代理:**可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高了系统的整体运行效率
- **虚拟代理:**通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销
- **缓冲代理:**为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间
- **保护代理:**可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢(例如保护代理)
- 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂(例如远程代理)
适用
- 当客户端对象需要访问远程主机中的对象时可以使用远程代理
- 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理
- 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理
- 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理
- 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星辰微光的博客!





