首页 > 代码库 > 设计模式学习笔记(十九:代理模式)
设计模式学习笔记(十九:代理模式)
1.1概述
为其他对象提供一种代理以控制对这个对象的访问。这就是代理模式的定义。
当用户希望和某个对象打交道,但程序可能不希望用户直接访问该对象,而是提供一个特殊的对象,这个特殊的对象被称作当前用户要访问对象的代理,程序让用户和对象的代理打交道,即让用户通过访问代理来访问想要访问的对象。在代理模式中,代理的特点是:它与所代理的对象实现了相同的接口,也就是说代理和它多代理的对象向用户公开了相同的方法,当用户请求代理调用该方法时,代理可能需要验证某些信息或检查它所代理的对象是否可用,当代理确认它所代理的对象能调用箱通风的方法时,就把实际的方法调用委派给它所代理的对象,即让所代理的对象调用同样的方法。
例如,公司里的秘书是老板的代理,老板和秘书都有听电话的方法:herePhone()。公司要求用户必须首先和秘书通电话才能和老板通电话,也就是说,用户必须首先请求秘书调用herePhone(),当秘书确认老板可以接电话时,就将用户的实际请求委派给老板,即让老板调用herePhone()方法。具体类关系如下图一所示:
图一:老板和秘书
1.2模式的结构
代理模式包括以下三种角色:
(1)抽象主题(Subject):抽象主题是一个接口,该接口是对象和它的代理所共用的接口,即是RealSubject角色和Proxy角色实例所实现的接口。
(2)实际主题(RealSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色(Proxy)实例所要代理的对象。
(3)代理(Proxy):代理是实现抽象主题接口的类(代理和实际主题实现了相同的接口)。代理含有主题接口声明的变量,该变量用来存放RealSubject角色的实例引用,这样一来,代理的实例就可以控制对它所包含的RealSubject角色的实例访问,即可以控制对它所代理对象的访问。
代理模式结构的类图如下图二所示:
图二:代理模式的类图
1.3代理模式的优点
(1)代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦。
(2)使用代理来担当那些创建耗时的对象的替身。
1.4适合使用代理模式的情景
(1)程序可能不希望用户直接访问该对象,而是提供一个特殊的对象以控制对当前对象的访问。
(2)如果一个对象(例如很大的图像)需要很长时间才能加载完成。
(3)如果对象位于远程主机上,需要为用户提供访问该远程对象的能力。
设计模式学习笔记(十九:代理模式)