代理模式:为其它对象提供一种代理,以控制对这个对象的访问。
一、UML结构图
二、示例代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 代理模式 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 //对访问端来说,只知道访问代理,不需要知道实际主题是谁。 13 //例如:只需要和代理索要相应资料即可。 14 Proxy p = new Proxy(); 15 p.SendMessage(); 16 p.ReceiveMessage(); 17 18 Console.ReadLine(); 19 } 20 } 21 22 23 /// <summary> 24 /// Subject主题类,用于定义需要代理的接口, 25 /// 例如:找代理办理护照,这里定义办理护照所需要的一切资料和手续 26 /// </summary> 27 public abstract class ProxySubject 28 { 29 public abstract void SendMessage();//发送消息 30 public abstract void ReceiveMessage();//接收消息 31 } 32 33 /// <summary> 34 /// 需要代理的真实类 35 /// 例如:真实需要办理护照的人,提供一切手续所需的各种资料 36 /// </summary> 37 public class RealSubject1:ProxySubject 38 { 39 public override void ReceiveMessage() 40 { 41 Console.WriteLine("RealSubject1 收到信息!"); 42 } 43 44 public override void SendMessage() 45 { 46 Console.WriteLine("RealSubject1 发送信息"); 47 } 48 } 49 50 /// <summary> 51 /// 代理类 52 /// 例如:接过真实办理护照人的信息,检查后,提供给相应部门(客户端) 53 /// </summary> 54 public class Proxy:ProxySubject 55 { 56 ProxySubject ps = null; 57 public Proxy() 58 { 59 //指定为谁代理 60 ps = new RealSubject1(); 61 } 62 63 public override void ReceiveMessage() 64 { 65 //此处可以添加一些代理需要处理的逻辑,如访问权限等 66 67 //然后再调用实际对象的信息 68 ps.ReceiveMessage(); 69 } 70 public override void SendMessage() 71 { 72 //此处可以添加一些代理需要处理的逻辑,如访问权限等 73 74 //然后再调用实际对象的信息 75 ps.SendMessage(); 76 } 77 } 78 79 }
三、代理模式应用
1、远程代理:如WebService,在应用程序中访问WebService时,需要添加一个引用,生成WebReference的文件夹和一些文件,其实这些文件就是代理,代理解决远程访问的问题。
2、虚拟代理:例如通过浏览器打开某个网页时,图片太大,没有加载完毕时,浏览器先用其它虚拟图片代替,此时虚拟图片存储了真实图片的路径和尺寸。
3、安全代理:用来控制真实对象的访问权限。
4、智能指引:当调用真实的对象时,代理处理另外一些事。