外观模式(10)

本篇博文,我们来说一下外观模式。

一、案例

我们大家都买过股票吗?即使没有买过股票的,也大体知道炒股是什么回事,说白了就是股票的买卖。

下面我们用简单的控制台应用程序来模拟一下股票买卖的场景。代码如下:

 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("\n方法组A()--------");
19             one.MethodOne();
20             two.MethodTwo();
21             four.MethodFour();
22         }
23 
24         public void MethodB()
25         {
26             Console.WriteLine("\n方法组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,小伙伴们慢慢体会一下吧。今天就到这里了。下篇博文,我们讲解 建造者模式


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

posted @ 2017-01-19 14:41  萌萌丶小魔王  阅读(314)  评论(0编辑  收藏  举报