设计模式——代理模式(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. 根据请求实现对象的访问权限

posted @ 2013-12-05 23:23  zhuhc  阅读(259)  评论(0编辑  收藏  举报