第551篇--设计模式系统-Proxy
代码说明
l IAccount就是抽象主题角色。代理对象和被代理对象都遵循这个接口,这样代理对象就能替换被代理对象。
注:在Adapter设计模式中,只有Adapter继承这个旧接口,目标客户端不粥承)
l AccountProxy就是代理主题角色。代理主题通常会存在一些逻辑或预处理或后处理操作,不会仅仅是对操作的转发。
l Account就是真实主题角色
何时采用
l 代理模式应用非常广泛,如果你希望降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率都可以考虑代理模式。
场景
降低复杂度和提高使用效率:
代 理模式非常常用,大致的思想就是通过为对象加一个代理来降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率。在现实生活中也有很多 代理的角色,比如明星的经纪人,他就是一种代理,经纪人为明星处理很多对外的事情,目的是为了节省被代理对象也就是明星的时间。保险代理人帮助投保人办理 保险,目的降低投保的复杂度。
注意事项
l Proxy、Facade以及Adapter可能都是对对象的一层封装,侧重点不同。Proxy基于一致的接口进行封装,Facade针对封装子系统,转化为高层接口,而Adapter的封装是处于适配接口的目的。
代码:
using System; using System.Collections.Generic; using System.Text; namespace ProxyExample { class Program { static void Main(string[] args) { AccountProxy ap = new AccountProxy(); ap.Register(); } } interface IAccount { void Register(); } class Account : IAccount { public void Register() { System.Threading.Thread.Sleep(1000); Console.WriteLine("Done"); } } class AccountProxy : IAccount { readonly bool isDebug = false ; IAccount account; public AccountProxy() { if (isDebug) account = new Account(); else //account = (IAccount)Activator.GetObject(typeof(IAccount), "uri"); account = Activator.CreateInstance(typeof(Account)) as IAccount; } public void Register() { Console.WriteLine("Please wait..."); account.Register(); } } }
UML类图:
源码及UML源图:https://skydrive.live.com/#cid=6B286CBEF1610557&id=6B286CBEF1610557!738