今天,我们来讲一下代理模式
一、举例:
大家都追过女孩子,作为比较腼腆,不爱说话的程序员,想要送给心仪的女孩子礼物,但又不好意思,所以,会让自己比较外向豪放的好朋友去办这件事。自己买了礼物,然后让好朋友帮忙送给女孩子。
二、演绎
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 = "羊羊&