代理模式
概述
代理模式是一种结构型模式,让你能够提供对象的代替品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理
常见的使用场景
-
延迟初始化(虚拟代理):如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式
你无需在程序启动时就创建该对象,可将对象的初始化延迟到真正有需要的时候
-
访问控制(保护代理):如果你只希望特定客户端使用服务对象,这里的对象可以是操作系统中非常重要的部分,而客户端是各种已启动的程序(包括恶意程序),此时可使用代理模式
代理可仅在客户端凭据满足要求时将请求传递给服务对象
-
本地执行远程服务(远程代理):适用于服务对象处于远程服务器上的情形
在这种情形中,代理通过网络传递客户端请求,负责处理所有于网络相关的复杂细节
-
记录日志请求(日志记录代理):适用于当你需要保存对于服务对象的请求历史记录时,代理可以在向服务传递请求前进行记录
-
缓存请求结果(缓存代理):适用于需要缓存客户请求结果并对缓存生命周期进行管理时,特别是当返回结果的体积非常大时
代理可对重复请求所需的相同结果进行缓存,还可使用请求参数作为索引缓存的键值
-
智能引用:可在没有客户端使用某个重量级对象时立即销毁该对象
代理会将所有获取了指向服务对象或其结果的客户端记录在案。代理会时不时地遍历各个客户端,检查它们是否仍在运行。如果相应的客户端列表为空代理就会销毁该服务对象,释放底层系统资源
实现方式
- 如果没有现成的接口,就要创建一个接口来实现代理和服务对象的可交换性
- 创建代理类,其中必须包含一个存储指向服务的引用的成员变量。通常情况下, 代理负责创建服务并对其整个生命周期进行管理。 在一些特殊情况下, 客户端会通过构造函数将服务传递给代理。
- 根据需求实现代理方法。在大部分情况下, 代理在完成一些任务后应将工作委派给服务对象。
- 可以考虑新建一个构建方法来判断客户端可获取的是代理还是实际服务
- 可以考虑为服务对象实现延迟初始化
代理模式的优缺点
优点
- 可以在客户端毫无察觉的情况下控制服务对象
- 可以对生命周期进行管理
- 即使服务对象还未准备好或者不存在,代理也可以正常使用
- 开闭原则
缺点
- 代码会变得很复杂
- 服务响应可能会延迟