C# Design Patterns (4) - Proxy
2009-07-06 07:07:20 来源:WEB开发网保护代理 (Protection Proxy; Access Proxy):检查调用者是否有权限,去访问真实的对象,例如用户是否有输入正确的密码以通过认证。
智能引用代理 (Smart Reference Proxy):当对象被调用时,提供一些额外的操作,例如:记录对象被调用的次数。
虚拟代理 (Virtual Proxy):让一个资源消耗较大的对象,只有在需要时才会真正被创建,或让真实对象只有在第一次被调用时才创建。
其他,例如:Copy-On-Write Proxy、Cache Proxy、Firewall Proxy、Synchronization Proxy...等 [2], [3], [5]。
在 GoF 中所举的例子是 Virtual Proxy,举了一个文档中内嵌图片的范例 [4], [11]。若图片是在文档 (如:PDF、PowerPoint) 的其中某一页,用户刚打开文档时,并不需要载入图片,可先用一个 ImageProxy,代替真实的图片被载入;当用户滚动滚动条、转到文档特定的页数时,才真正从硬盘载入图片,以求开启此文档时能加快速度,让用户对此软件有较好的体验。
图 3 虚拟代理 (Virtual Proxy) 在 GoF 示例的类图,与本帖图 1 的原理相同
如上图 3 及下方代码所示,当文档被开启时,ImageProxy 对象会代替 (代理) Image 对象被载入,在用户还没转到图片所在的页数时,也就是还没调用 ImageProxy 的 draw 方法时,图片并不会被载入,因此可加速文档的开启、节省内存的使用;当用户转到图片所在页数时,ImageProxy 的 draw 方法才会被调用,此时才真正去创建 Image 对象、从硬盘中载入图片。在此例的 draw 方法里,我们实现了「虚拟代理」,只有在方法「第一次」被调用时,才创建资源消耗大的 Image 对象,以节省内存、控制创建成本昂贵的资源。
更多精彩
赞助商链接