DesignPattern.Ch7.Prexy.Note
代理模式(Prexy)为其他对象提供一种代理以控制这个对象的访问[DP]。
代理模式代码代码比较简单,但是应用场景难于理解。
代理模式菜鸟设计应用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 namespace Pattern.Proxy.Newbie 2 { 3 interface IGiveGift 4 { 5 void GiveDolls(); 6 void GiveFlowers(); 7 void GiveChocolate(); 8 } 9 10 class Proxy : IGiveGift 11 { 12 Pursuit GG { get; set; } 13 14 public Proxy(SchoolGirl girl) 15 { 16 GG = new Pursuit(girl); 17 } 18 public void GiveDolls() 19 { 20 GG.GiveDolls(); 21 } 22 23 public void GiveFlowers() 24 { 25 GG.GiveFlowers(); 26 } 27 28 public void GiveChocolate() 29 { 30 GG.GiveChocolate(); 31 } 32 } 33 34 class Pursuit : IGiveGift 35 { 36 SchoolGirl Girl { get; set; } 37 38 public Pursuit(SchoolGirl girl) 39 { 40 this.Girl = girl; 41 } 42 public void GiveDolls() 43 { 44 Console.WriteLine("{0} 送你的洋娃娃。", this.Girl.Name); 45 } 46 47 public void GiveFlowers() 48 { 49 Console.WriteLine("{0} 送你的玫瑰花。", this.Girl.Name); 50 } 51 52 public void GiveChocolate() 53 { 54 Console.WriteLine("{0} 送你的巧克力。", this.Girl.Name); 55 } 56 } 57 class SchoolGirl 58 { 59 public string Name { get; set; } 60 public SchoolGirl(string name) 61 { 62 this.Name = name; 63 } 64 } 65 }
代理模式原型设计应用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 namespace Pattern.Proxy.Prototype 2 { 3 abstract class Subject 4 { 5 public abstract void Request(); 6 } 7 8 class RealSubject : Subject 9 { 10 public override void Request() 11 { 12 Console.WriteLine("真实的请求。"); 13 } 14 } 15 class Proxy : Subject 16 { 17 Subject real { get; set; } 18 public override void Request() 19 { 20 if (real == null) 21 real = new RealSubject(); 22 real.Request(); 23 } 24 25 } 26 }
调用代理:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace Pattern.Proxy { class Program { static void Main(string[] args) { SchoolGirl mm = new SchoolGirl("jiaojiao"); Pattern.Proxy.Newbie.Proxy prexy = new Pattern.Proxy.Newbie.Proxy(mm); prexy.GiveChocolate(); prexy.GiveDolls(); prexy.GiveFlowers(); Pattern.Proxy.Prototype.Proxy proxy = new Prototype.Proxy(); proxy.Request(); } } }
代理模式的应用
一般来说分为几种,第一种,远程代理,也就是为一个对象在不同的地址空间提供局部代理。这样可以隐藏一个对象存在于不同地址空间的事实[DP]。
添加WebService时,在目录中声称一个WebReference文件夹和文件,它们就是代理,这就是客户端程序调用代理解决远程访问的问题。
第二种应用是虚拟代理,是根据需要创建开销很大的对象。通过它来创建实例化需要很长时间的对象[DP],这样可以达到性能的优化,比如打开一个html页面文字可以很快显示出来,但是大图片需要一张一张的下载。
第三种应用是安全代理,用来控制真是对象的访问权限[DP]。一般用于对象有同通的访问权限的时候。
第四种智能指引,是指当调用真是的对象时,代理处理另外一些事情[DP]。
代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。