C# Design Patterns (4) - Proxy
2009-07-06 07:07:20 来源:WEB开发网上方图 1 的 Class Diagram,以及「Shell (壳)」示例中,我们有一个 Subject 抽像类,这是 RealSubject 和 Proxy 共同的接口,好让任何用户都可将 Proxy 对象 (代理者) 视为 RealSubject 对象 (被代理者,亦即真实的对象) 来处理。
其中 RealSubject 是真正做事的对象,它是被 Proxy 代理的对象,它的方法是真正做事的函数,并会将一些复杂的工作封装在其方法里,而无须让客户端程序知道实现细节为何;而 Proxy 中的同名称方法 (Request 方法),则可做一些逻辑判断,比如上例中,我们做了 realSubject 是否为 null 的 if 判断,亦即只有客户程序第一次调用此函数时,才去创建 RealSubject 对象。
客户端和 RealSubject 的互动,都必须透过 Proxy。也由于 Proxy 和 RealSubject 实现了相同的接口,所以客户在任何需要 RealSubject 的地方,都可以用 Proxy 取而代之。此外,Proxy 也控制了客户端对 RealSubject 的访问,其目的如同本帖一开始所说的,因为 RealSubject 可能是网络上远端机器上的对象、创建时需要高成本、或需要安全控管及经过认证才能访问的对象。其原理类似于下图 2 的 HTTP Proxy Server 情景,Client-side 想要前往 Internet 取得 Web Server 上的信息时,可透过 Proxy Server 帮忙处理;其中 Web Server 就如同 RealSubject (被代理者),而 Proxy Server 就如同 Proxy (代理者)。
图 2 基于代理的远程访问示意图
Proxy Pattern 依照功能和目的、运行环境的不同,可概略分成以下几种:
远程代理 (Remote Proxy):替网络上机器与机器之间的请求 (request),做「发送 / 接收」和编码、加密…等工作,让用户端程序,只要调用这个代理就能做远端调用,如:Java RMI、Web Service、.NET Remoting、.NET WCF。其中 Web Service 和 WCF,会在引用的客户端程序中,产生 App_WebReferences 文件夹、一些档案和代理类,这些档案即为此种远程代理。
更多精彩
赞助商链接