今天,我们来讲一下代理模式
一、举例:
大家都追过女孩子,作为比较腼腆,不爱说话的程序员,想要送给心仪的女孩子礼物,但又不好意思,所以,会让自己比较外向豪放的好朋友去办这件事。自己买了礼物,然后让好朋友帮忙送给女孩子。
二、演绎
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集最后,秀才让小六代其求婚。这就是典型的代理模式。
好了,今天就到这吧,下一篇,会讲 工厂方法模式(不是简单工厂模式哦)
本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。