设计模式之代理模式
以男生追MM为例子 男A 要求 男B 帮他? 追求女C 未使用代理的案例 追求者A: ?class? Pursuit{ ????? ? SchoolGirl mm; ??????? public Pursuit(SchoolGirl mm){ ???????????? this.mm=mm; }? ??? public void GiveDolls( ){ ????? Console.WriteLine(mm.Name+"送你洋娃娃"); } ? ? public void GiveFollwers(){ Console.WriteLine(mm.Name+"送你鲜花"); } public void GiveChocolate(){ Console,WriteLine(mm.Name+"送你巧克力"); ? } } ? 被追求者C class SchoolGirl(){ ? public string Name{set;get;} ? } ? 客户端代码 static void main(string[] args){ ?? SchoolGirl jiaojiao =new SchoolGirl(); ??jiaojiao.Name="C"; Pursuit?A =new Pursuit(jiaojiao);----------------------------------->A 直接向C 送花,送巧克力,并没有要B帮忙 A.GiveDolls(); A.GiveFolwers(); A.GiveChocolate(); A.Console.Read(); ? } ? 在之前的代码做改进 追求者 class? Proxy{ ????? ? SchoolGirl mm; ??????? public Pursuit(SchoolGirl mm){ ???????????? this.mm=mm; }? ??? public void GiveDolls( ){ ????? Console.WriteLine(mm.Name+"送你洋娃娃"); } ? ? public void GiveFollwers(){ Console.WriteLine(mm.Name+"送你鲜花"); } public void GiveChocolate(){ Console,WriteLine(mm.Name+"送你巧克力"); ? } } ? 被追求者: class SchoolGirl(){ ? public string Name{set;get;} ? } ? 客户端代码: static void main(string[] args){ ?? SchoolGirl jiaojiao =new SchoolGirl(); ??jiaojiao.Name="C"; Proxy?A =new Proxy(jiaojiao);----------------------------------->是代理B主动向C献花,送巧克力,并没有体现A的存在 A.GiveDolls(); A.GiveFolwers(); A.GiveChocolate(); A.Console.Read(); ? } ? 再做改进: 代理接口: interface IGiveGift( ){ void GiveDolls( ); void GiveFlowers( ); void GiveChocolate( ); } 追求者类 A ? Class Pursuit : IGiveGift{ SchoolGirl mm; Pubilc Pursuit(SchoolGirl mm){ this.mm=mm; } public void GiveDolls( ){ ????? Console.WriteLine(mm.Name+"送你洋娃娃"); } ? ? public void GiveFollwers(){ Console.WriteLine(mm.Name+"送你鲜花"); } public void GiveChocolate(){ Console,WriteLine(mm.Name+"送你巧克力"); ? } ? } ? 被追求者 C: ? class SchoolGirl(){ ? public string Name{set;get;} ? } 代理类? B: class Proxy : IGivegift{ Pursuit? A; public Proxy (SchoolGirl mm){ A =new Pursuit(mm); ? public void GiveDolls(){ A.GiveDolls(); } public void GiveFlowers(){ A.GiveFlowers(); } }public void GiveChocolate(){ A.GiveChocolate(); } } ? 客户端代码 static void main(string[] args){ SchoolGirl C=new SchoolGirl(); C.Name="C"; Proxy B=new Proxy(C);-------------------------->B 中产生了A的对象,就是? B替A给C 送鲜花,巧克力 B.GiveDolls(); B.GiveFlowers(); B.GiveChocolate(); Console.Read(); } ? 代理模式:为其他对象提供一种代理 以控制对这个对象的访问,隐藏了真正要访问的类。 ? 案例分析: abstract?? class Subject{ public? abstract void Request(); } ? ?class RealSubject ?:Subject { ??????? public override Request(){ ???????? ?Console.Write("真实的请求"); ?????????????? } ???? } ? ? ?class Proxy :Subject { ??? ?RealSubject realSubject ; ??? public override?void Request() ? { ???????? if(realSubject ==null){ ????? realSubject =new RealSubject(); } ?? realSubject.Request(); ? }? } static void main(string[] args){ Proxy proxy=new Proxy(); proxy.Request(); Console.Read(); } ? 应用场合: 1 远程代理??为一个对象在不同的地址空间 提供局部代表 可以隐藏一个对象在于 不同地址空间的事实? ?WebService? 在应用程序中添加WEB引用,引用一个WebService,会在项目中生成一个WEBREFERENCE的文件夹和一些文件,这些就是代理,使得客户端调用代理就可以解决远程访问的问题 2 虚拟代理? 是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,例如访问网页时,当网页中内容很多时,用户可以浏览到文章,然而图片却一直在加载,是因为那些图片是通过代理来代替真实的图片。 3 安全代理 控制对真实对象的访问 4智能指引 当调用一些真实的对象,代理去处理一些事情 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |