本篇博文,我们来说一下外观模式。
一、案例
我们大家都买过股票吗?即使没有买过股票的,也大体知道炒股是什么回事,说白了就是股票的买卖。
下面我们用简单的控制台应用程序来模拟一下股票买卖的场景。代码如下:
1 //股票1 2 class Stock1 3 { 4 public void Sall() 5 { 6 Console.WriteLine("股票1卖出"); 7 } 8 9 public void Buy() 10 { 11 Console.WriteLine("股票1买入"); 12 } 13 } 14 //股票2 15 class Stock2 16 { 17 public void Sall() 18 { 19 Console.WriteLine("股票2卖出"); 20 } 21 22 public void Buy() 23 { 24 Console.WriteLine("股票2买入"); 25 } 26 27 } 28 //股票3 29 class Stock3 30 { 31 public void Sall() 32 { 33 Console.WriteLine("股票3卖出"); 34 } 35 36 public void Buy() 37 { 38 Console.WriteLine("股票3买入"); 39 } 40 } 41 //国债1 42 class NationalDebt1 43 { 44 public void Sall() 45 { 46 Console.WriteLine("国债1卖出"); 47 } 48 49 public void Buy() 50 { 51 Console.WriteLine("国债1买入"); 52 } 53 } 54 //房地产1 55 class Realty1 56 { 57 public void Sall() 58 { 59 Console.WriteLine("房地产1卖出"); 60 } 61 62 public void Buy() 63 { 64 Console.WriteLine("房地产1买入"); 65 } 66 }
客户端:
1 public static void Main() 2 { 3 Stock1 gu1 = new Stock1(); 4 Stock2 gu2 = new Stock2(); 5 Stock3 gu3 = new Stock3(); 6 NationalDebt1 nd1 = new NationalDebt1(); 7 Realty1 rt1 = new Realty1(); 8 9 gu1.Buy(); 10 gu2.Buy(); 11 gu3.Buy(); 12 nd1.Buy(); 13 rt1.Buy(); 14 15 gu1.Sall(); 16 gu2.Sall(); 17 gu3.Sall(); 18 nd1.Sall(); 19 rt1.Sall(); 20 Console.Read(); 21 }
二、演绎
嗯,然而,对于不了解股票的朋友来说,面对这么多支股票,他们也不知道改如何买卖这些股票,所以,他们通常会选择购买基金,基金相对股票风险小一些。基金是什么呢?(怎么说呢,我比较笨一些,不知道怎么解释,大家可以百度一下 基金和股票的区别,哈哈)。
基金包含多只股票,好,下面我们来改写一下这个案例,我们现在不买卖股票了,我们现在来买卖基金。
好,我们新加一个基金类
1 /// <summary> 2 /// 基金类 3 /// </summary> 4 class Fund 5 { 6 private Stock1 gu1; 7 private Stock2 gu2; 8 private Stock3 gu3; 9 private NationalDebt1 nd1; 10 private Realty1 rt1; 11 12 public Fund() 13 { 14 gu1 = new Stock1(); 15 gu2 = new Stock2(); 16 gu3 = new Stock3(); 17 nd1 = new NationalDebt1(); 18 rt1 = new Realty1(); 19 } 20 21 public void BuyFund() 22 { 23 gu1.Buy(); 24 gu2.Buy(); 25 gu3.Buy(); 26 nd1.Buy(); 27 rt1.Buy(); 28 } 29 30 public void SellFund() 31 { 32 gu1.Sall(); 33 gu2.Sall(); 34 gu3.Sall(); 35 nd1.Sall(); 36 rt1.Sall(); 37 } 38 }
那么,客户端这么写了:
1 public static void Main() 2 { 3 //此时,用户不需要了解股票,甚至可以对股票一无所知,买完基金回家睡觉, 4 //过一段时间,再赎回就可以大把数钱玩了。 5 Fund jijin = new Fund(); 6 //购买基金 7 jijin.BuyFund(); 8 //基金赎回 9 jijin.SellFund(); 10 Console.Read(); 11 }
以上这种写法,就差不多是外观模式的基本代码了。好,下面我们来正式给大家说一下什么是外观模式。
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高级接口,这一接口使得子系统更加容易使用。
下面我们来正式写一下外观模式的代码:
有很多的子系统:
1 class SubSystemOne 2 { 3 public void MethodOne() 4 { 5 Console.WriteLine("子系统中的方法1"); 6 } 7 } 8 9 class SubSystemTwo 10 { 11 public void MethodTwo() 12 { 13 Console.WriteLine("子系统中的方法2"); 14 } 15 } 16 17 class SubSystemThree 18 { 19 public void MethodThree() 20 { 21 Console.WriteLine("子系统中的方法3"); 22 } 23 } 24 25 class SubSystemFour 26 { 27 public void MethodFour() 28 { 29 Console.WriteLine("子系统中的方法4"); 30 } 31 }
有一个外观类
1 class Facade 2 { 3 private SubSystemOne one; 4 private SubSystemTwo two; 5 private SubSystemThree three; 6 private SubSystemFour four; 7 8 public Facade() 9 { 10 one = new SubSystemOne(); 11 two = new SubSystemTwo(); 12 three = new SubSystemThree(); 13 four = new SubSystemFour(); 14 } 15 16 public void MethodA() 17 { 18 Console.WriteLine(" 方法组A()--------"); 19 one.MethodOne(); 20 two.MethodTwo(); 21 four.MethodFour(); 22 } 23 24 public void MethodB() 25 { 26 Console.WriteLine(" 方法组B()---------"); 27 two.MethodTwo(); 28 three.MethodThree(); 29 } 30 }
客户端调用:
1 public static void Main() 2 { 3 Facade facade = new Facade(); 4 facade.MethodA(); 5 facade.MethodB(); 6 Console.ReadKey(); 7 }
以上,便是外观模式的代码了。
外观模式很好的体现了依赖倒转原则和迪米特法则,所以,外观模式是一种非常常用的设计模式。
ok,小伙伴们慢慢体会一下吧。今天就到这里了。下篇博文,我们讲解 建造者模式
本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。