设计模式——代理模式(Proxy Pattern)
1. 作用
代理模式支持某些对象控制其他对象的创建和访问。代理一般是由简单对象代替复杂对象,并且这些复杂对象会随着环境的确定而被激活。
2. 设计
UML图:
说明:
1. Proxy 包含 Subject 对象。
2. Proxy 实现 ISubject 接口。
3. Client 包含 ISubject 接口定义的对象。
分类:
1. 虚拟代理:通过另一个对象来创建对象。
2. 认证代理:检查请求是否具有访问权限。
3. 远程代理:编码请求,并通过网络发送该请求。
4. 智能代理:在发送请求前,增加或者改变请求。
3. 实现
实现代码:
1 using System; 2 3 namespace DesignPatternConsoleDemo.ProxyPattern 4 { 5 public interface ISubject 6 { 7 string Request(); 8 } 9 10 public class Subject 11 { 12 public string Request() 13 { 14 return "Subject Reques Choose left door\n"; 15 } 16 } 17 18 public class Proxy : ISubject 19 { 20 Subject subject; 21 public string Request() 22 { 23 if (subject == null) 24 { 25 Console.WriteLine("Subject Inactive"); 26 subject = new Subject(); 27 } 28 Console.WriteLine("Subject Active"); 29 return "Proxy: Call to " + subject.Request(); 30 } 31 } 32 33 public class ProtectionProxy : ISubject 34 { 35 Subject subject; 36 string password = "123456"; 37 public string Authenticate(string supplied) 38 { 39 if (supplied != password) 40 return "Protection Proxy: No Access"; 41 else 42 { 43 subject = new Subject(); 44 return "Protection Proxy: Authenticated"; 45 } 46 } 47 public string Request() 48 { 49 if (subject == null) 50 { 51 return "Protection Proxy: Authenticate First"; 52 } 53 else 54 { 55 return "Protection Proxy: Call to " + subject.Request(); 56 } 57 } 58 } 59 public class Client 60 { 61 public static void Demo() 62 { 63 Console.WriteLine("Proxy Pattern \n"); 64 ISubject subject = new Proxy(); 65 Console.WriteLine(subject.Request()); 66 Console.WriteLine(subject.Request()); 67 68 subject = new ProtectionProxy(); 69 Console.WriteLine(subject.Request()); 70 Console.WriteLine((subject as ProtectionProxy).Authenticate("123321")); 71 Console.WriteLine((subject as ProtectionProxy).Authenticate("123456")); 72 Console.WriteLine(subject.Request()); 73 } 74 } 75 }
调用:
1 namespace DesignPatternConsoleDemo 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 DesignPatternConsoleDemo.ProxyPattern.Client.Demo(); 8 } 9 } 10 }
结果:
Proxy Pattern
Subject Inactive
Subject Active
Proxy: Call to Subject Reques Choose left door
Subject Active
Proxy: Call to Subject Reques Choose left door
Protection Proxy: Authenticate First
Protection Proxy: No Access
Protection Proxy: Authenticated
Protection Proxy: Call to Subject Reques Choose left door
4. 应用场景
代理模式在图像显示系统中比较常见,代理在屏幕是放置一个容器,之后激活一个真正的画图对象来获取和解析显示图像。同理,代理模式可以用于初始化视频流的缓冲。
代理和装饰一样,前台接受请求,然后转交另一对象进行处理。不同的是,代理关系是在设计时就确定的和明确的。而装饰是动态添加。
适用性:
现有:
1. 创建成本很高
2. 需要权限控制
3. 访问远程站点
4. 无论是否有权限,都需要有反馈
目标:
1. 根据请求的操作来创建对象
2. 无论是否有权限,都需要有反馈
3. 本地对可以引用远程对象
4. 根据请求实现对象的访问权限