代理模式:为其他对象提供一种代理以控制对这个对象的访问。
类型
结构型
用途
隐藏 Copy-On-Write
区别
- Adapter 为它所适配的对象提供了一个不同的接口。Proxy 提供了与它的实体相同的接口
- Decorator 的实现与 Proxy 相似,但目的不一样。 Decorator 为对象添加功能,Proxy 则控制对对象的访问。
参与者
- Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
- Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象,并对真实主题对象的使用加以约束。通常,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
- RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
常用代理模式
分类
-
远程代理(Remote Proxy):
为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又称为<u>大使(Ambassador)</u>。客户端对象不能直接访问远程主机中的业务对象,只能采取间接访问的方式。远程业务对象在本地主机中有一个代理对象,远程代理将网络的细节都隐藏起来,使客户端完全不关心远程业务对象在本地还是远程,对客户端透明。
应用:
基于.NET平台的分布式技术,例如DCOM(Distribute Component Object Model,分布式组件对象模型)
Web Service中,都应用了远程代理模式
-
虚拟代理(Virtual Proxy):
如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
应用:
- 由于对象本身的复杂性或者网络等原因导致一个对象需要较长的加载时间,此时可以用一个加载时间相对较短的代理对象来代表真实对象。通常在实现时可以结合多线程技术,一个线程用于显示代理对象,其他线程用于加载真实对象。应用在程序启动的时候,可以缩短用户的等待时间。
- 当一个对象的加载十分耗费系统资源的时候,虚拟代理可以让那些占用大量内存或处理起来非常复杂的对象推迟到使用它们的时候才创建,而在此之前用一个相对来说占用资源较少的代理对象来代表真实对象,再通过代理对象来引用真实对象。
-
保护代理(Protect Proxy):
控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
应用:
- 鉴权:在调用真实主题逻辑前,对用户的权限进行判断。
-
缓冲代理(Cache Proxy):
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。从而可以避免某些方法的重复执行,优化系统性能。
应用:
- 使用lazy-mode,如果缓冲中没有数据再从业务逻辑层获取。
-
智能引用代理(Smart Reference Proxy):
当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。
适用场景
- 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
- 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
- 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
- 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
- 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。
远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。