设为首页 加入收藏

TOP

代理模式(6)(一)
2017-10-13 10:40:11 】 浏览:5725
Tags:代理 模式

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

一、举例:

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

二、演绎

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 = "羊羊&
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇大型网站架构技术 下一篇dubbo-admin管理平台搭建

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目