代理模式(一)
引言
代理设计模式(Proxy)可能对大多数人来说并不熟悉,然而其在WebService方面的应用却是非常广泛,本文试图通过三个简单的实例描述代理设计模式的应用场景,希望读者通过这篇文章能够对代理设计模式有一个大概的认识。
应用场景
代理设计模式,说简单点就是为目标对象提供一个代理以控制对其的访问。当我们需要使用的对象很复杂或者需要很长的时间去构造,这时,我们就可以使用代理模式(Proxy)。它相当于Client与实际请求对象之间的一个中介,我们可以理解为它是一个房屋中介。
为什么需要中介呢?我们可以考虑下,当我们买房或者租房的时候,为什么不直接去办而要通过中介?可能房主在外地,只是托中介帮忙联系买主。映射到程序里面就相当于你请求的对象资源在另一台机器上,你需要通过网络才能访问到。当然,你可以直接编码实现这一请求过程:连接远程机器,请求对象,序列化对象,传送,反序列化... 虽说能实现但是步骤很复杂,而且会导致客户端程序负担过重。为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就像调用本地对象一样调用该代理,由代理将客户端的请求转发给实际的远程对象,并将远程对象的回应转发给客户端。它就相当于客户端和远程对象之间的桥梁,作用就是简化客户端的调用实现。这一场景主要运用与WebService,后面我们详细介绍。
第二种情况,虽然你所调用的对象在本地,但是由于调用非常耗时,这时为了更好的提高用户体验,我们可能会采用代理。打个比方(只是比方,可能并不恰当),当我们在浏览器中请求一个页面,该页面包含若干图片,我们会发现网络如果不够快的话,图片是逐步载入的。倘若我们采用传统的方式,等把页面中的内容完全载入才向用户呈现,用户可能早就跑了。所以,我们可以设置一个代理,先向用户呈现文字和部分图像,等所有的图片完全载入了,再将完整的内容呈现给用户。
还有一种情况,除了当前类能够提供的功能外,我们还需要添加一些额外的功能。比如权限过滤,假设有一项业务,出于安全方面的考虑,我们只让拥有足够权限的用户访问,这个业务我们可以当成一个类。那么有两种方式,一种是修改当前的业务类,添加权限验证功能;这种方式可能是一般人能想到的最直接的方式,当这种设计显然不符合类设计的单一性原则,一个类的功能应该尽可能简单浓缩。另外这种方式的可维护性也极差,一旦权限有所更改就得修改业务类。另外一种方式就是采用代理,将权限认证放在代理里面实现,代理将符合权限的用户请求转发给业务对象,如此即便权限规则变了,只需要修改代理类,而不会影响到业务类。
前面主要是大段的文字描述,可能读者看得有点乏味了,下面我们来总结一下代理的主要应用场景:
- 请求的对象很大,比如一个大图像,需要载入的时间很长。
- 数据代理,切换不同的数据读取器(后面将会详细介绍)。
- 一个存在于远程计算机上的对象,需要通过网络载入这个远程对象。
- 一个对象只有有限的访问权限,需要额外的权限验证。
至此,有关代理设计模式的概念以及应用场景就介绍完毕了,后面两篇我将会通过几个典型的例子介绍代理模式的应用实例。