DesignPattern.Ch7.Prexy.Note

代理模式(Prexy)为其他对象提供一种代理以控制这个对象的访问[DP]。

代理模式代码代码比较简单,但是应用场景难于理解。

代理模式菜鸟设计应用:

Proxy.Newbie.Code
 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 }

代理模式原型设计应用:

Proxy.Prototype.Code
 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 }

调用代理:

Proxy.Main.Code
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]。

代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

posted @ 2013-03-26 16:11  Lovey  阅读(213)  评论(0编辑  收藏  举报