代理模式(6)

今天,我们来讲一下代理模式

一、举例:

大家都追过女孩子,作为比较腼腆,不爱说话的程序员,想要送给心仪的女孩子礼物,但又不好意思,所以,会让自己比较外向豪放的好朋友去办这件事。自己买了礼物,然后让好朋友帮忙送给女孩子。

二、演绎

1、第一步演绎

下面,我们用一个控制台来模拟演示一下这个场景。[追求者xmw(小魔王),被追求者yangyang(羊羊)]

 1  /// <summary>
 2     /// 追求者
 3     /// </summary>
 4     class Pursuit
 5     {
 6         SchoolGirl mm;
 7         public Pursuit(SchoolGirl mm)
 8         {
 9             this.mm = mm;
10         }
11 
12         public void GiveDolls()
13         {
14             Console.WriteLine($"{mm.Name}送你洋娃娃");
15         }
16         public void GiveFlowers()
17         {
18             Console.WriteLine($"{mm.Name}送你鲜花");
19         }
20         public void GiveChocolate()
21         {
22             Console.WriteLine($"{mm.Name}送你巧克力");
23         }
24     }
25     /// <summary>
26     /// 被追求者
27     /// </summary>
28     internal class SchoolGirl
29     {
30         public string Name { get; set; }
31     }

客户端调用:

 1  static void Main(string[] args)
 2         {
 3             SchoolGirl yangyang = new SchoolGirl();
 4             yangyang.Name = "羊羊";
 5             Pursuit xmw = new Pursuit(yangyang);
 6             xmw.GiveDolls();
 7             xmw.GiveFlowers();
 8             xmw.GiveChocolate();
 9             Console.ReadKey();
10         }

好了,大家一眼就可以发现问题了,上述代码描述的是我直接送礼物给心仪的女孩子,没有经过我的好朋友来帮忙。

2、第二步演绎

好,下面我们来修改一下,让好朋友[qihe(齐贺)] 来帮忙送给她。

 1 class Proxy
 2     {
 3         SchoolGirl mm;
 4         public Proxy(SchoolGirl mm)
 5         {
 6             this.mm = mm;
 7         }
 8 
 9         public void GiveDolls()
10         {
11             Console.WriteLine($"{mm.Name}送你洋娃娃");
12         }
13         public void GiveFlowers()
14         {
15             Console.WriteLine($"{mm.Name}送你鲜花");
16         }
17         public void GiveChocolate()
18         {
19             Console.WriteLine($"{mm.Name}送你巧克力");
20         }
21     }
22     internal class SchoolGirl
23     {
24         public string Name { get; set; }
25     }

客户端:

 1   static void Main(string[] args)
 2         {
 3             SchoolGirl yangyang = new SchoolGirl();
 4             yangyang.Name = "羊羊";
 5             Proxy qihe = new Proxy(yangyang);
 6             qihe.GiveDolls();
 7             qihe.GiveFlowers();
 8             qihe.GiveChocolate();
 9             Console.ReadKey();
10         }

靠,你耍我呢,这不就等于把 小魔王 换成 齐贺 了吗,其他啥也没变,这样的话不就等于 齐贺 去追 羊羊了,没小魔王啥事了。

其实这件事的本质就是,尽管礼物是通过齐贺送的,但是,礼物是小魔王买的,也是小魔王送给羊羊的。

3、第三步演绎

注意一下,齐贺 和 小魔王 都有一个共同的功能,就是送礼物这个功能,所以,我们可以将这个功能抽象成一个接口,让他俩都继承这个接口。

好,下面我们再修改一下

 

 1  /// <summary>
 2     /// 送礼物的接口
 3     /// </summary>
 4     interface GiveGift
 5     {
 6         void GiveDolls();
 7         void GiveFlowers();
 8         void GiveChocoolate();
 9     }
10     /// <summary>
11     /// 追求者类(可以实例化成小魔王)
12     /// </summary>
13     class Pursuit : GiveGift
14     {
15         SchoolGirl yangyang;
16         public Pursuit(SchoolGirl yangyang)
17         {
18             this.yangyang = yangyang;
19         }
20         public void GiveChocoolate()
21         {
22             Console.WriteLine($"{yangyang.Name}送你巧克力");
23         }
24 
25         public void GiveDolls()
26         {
27             Console.WriteLine($"{yangyang.Name}送你洋娃娃");
28         }
29 
30         public void GiveFlowers()
31         {
32             Console.WriteLine($"{yangyang.Name}送你鲜花");
33         }
34     }
35     /// <summary>
36     /// 代理类(可以实例化成齐贺)
37     /// </summary>
38     class Proxy : GiveGift
39     {
40         Pursuit xmw;
41         public Proxy(SchoolGirl yangyang)
42         {
43             xmw = new Pursuit(yangyang);
44         }
45         public void GiveChocoolate()
46         {
47             xmw.GiveDolls();
48         }
49 
50         public void GiveDolls()
51         {
52             xmw.GiveFlowers();
53         }
54 
55         public void GiveFlowers()
56         {
57             xmw.GiveChocoolate();
58         }
59     }
60     /// <summary>
61     /// 被追求者(可以实例化成羊羊)
62     /// </summary>
63     internal class SchoolGirl
64     {
65         public string Name { get; set; }
66     }

客户端:

 1    static void Main(string[] args)
 2         {
 3             SchoolGirl yangyang = new SchoolGirl();
 4             yangyang.Name = "羊羊";
 5             Proxy qihe = new Proxy(yangyang);
 6             qihe.GiveDolls();
 7             qihe.GiveChocoolate();
 8             qihe.GiveFlowers();
 9             Console.ReadKey();
10         }

这样,尽管 new Proxy(), 而且也是调用的Proxy里的Give...() 方法,但是,可以看一下上面的代码,实质是追求者类的方法。

这样也就解决了上述的问题,甚至SchoolGirl(羊羊)类都有可能不认识Pursuit(小魔王)类。

ok,下面,下面我们一句话总结一下代理模式:为其他对象提供一种代理以控制对这个对象的访问。

大家可以多写一写上述的代码,慢慢体会一下。

还有,给大家一个生活中真真切切代理模式的例子: 《武林外传》22集最后,秀才让小六代其求婚。这就是典型的代理模式。

好了,今天就到这吧,下一篇,会讲 工厂方法模式(不是简单工厂模式哦)


本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。

posted @ 2017-01-10 08:54  萌萌丶小魔王  阅读(589)  评论(1编辑  收藏  举报