设计模式(八)外观模式

外观模式(Facade),又叫门面模式。为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式完美地体现了依赖倒转原则迪米特法则的思想,所以是非常常用的模式之一。外观模式的使用方法:

1、在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层业务逻辑层业务逻辑层表示层的层与层之间建立外观 Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。

2、在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖。

3、在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式 Facade 也是非常合适的。你可以为新系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作。

 代码实现

 1 class  SubSystemOne
 2 {
 3   public  void  MethodOne()
 4   {
 5     Console.WriteLine(" 子系统方法一 ");
 6   }
 7 }
 8 class  SubSystemTwo
 9 {
10   public  void  MethodTwo()
11   {
12     Console.WriteLine(" 子系统方法二 ");
13   }
14 }
15 class  SubSystemThree
16 {
17   public  void  MethodThree()
18   {
19     Console.WriteLine(" 子系统方法三 ");
20   }
21 }
22 class  SubSystemFour
23 {
24   public  void  MethodFour()
25   {
26     Console.WriteLine(" 子系统方法四 ");
27   }
28 }
29 // 外观类,它需要了解所有的子系统的方法或属性,进行组合,以备外界调用
30 class  Facade
31 {
32   SubSystemOne  one;
33   SubSystemTwo  two;
34   SubSystemThree  three;
35   SubSystemFour  four;
36 
37   public  Facade()
38   {
39     one = new SubSystemOne();
40     two = new SubSystemTwo();
41     three = new SubSystemThree();
42     four = new SubSystemFour();
43   }
44 
45   public  void  MethodA()
46   {
47     Console.WriteLine("\n 方法组A()-----");
48     one.MethodOne();
49     two.MethodTwo();
50     four.MethodFour();
51   }
52 
53   public  void  MethodB()
54   {
55     Console.WriteLine("\n 方法组B()-----");
56     two.MethodTwo();
57     three.MethodThree();
58   }
59 }
60 
61 // 客户端调用,由于 Facade 的作用,客户端可以根本不知三个字系统类的存在
62 static  void  Main(string[]  args)
63 {
64   Facade  facade = new Facade();
65 
66   facede.MethodA();
67   facede.MethodB();
68 
69   Console.Read();
70 }

 【例】投资基金

代码

 1 // 股票 1
 2 class  Stock1
 3 {
 4   // 卖股票
 5   public  void  Sell()
 6   {
 7     Console.WriteLine("股票 1 卖出");
 8   }
 9 
10   // 买股票
11   public  void  Buy()
12   {
13     Console.WriteLine("股票 1 买入");
14   }
15 }
16 // 股票 2
17 class  Stock2
18 {
19 }
20 // 股票 3
21 class  Stock3
22 {
23 }
24 // 国债 1
25 class  NationalDebt1
26 {
27 }
28 // 房地产 1
29 class  Realty1
30 {
31 }
32 // 基金类,它需要了解所有的股票或其他投资方式的方法或属性,进行组合,以备外界调用
33 class  Fund
34 {
35   Stock1   gu1;
36   Stock2  gu2;
37   Stock3  gu3;
38 
39   NationalDebt1  nd1;
40   Realty1  rt1;
41 
42   public  Fund()
43   {
44     gu1 = new  Stock1();
45     gu2 = new  Stock2();
46     gu3 = new  Stock3();
47     nd1 = new  NationalDebt1();
48     rt1 = new  Realty1();  
49   }
50 
51   public  void  BuyFund()
52   {
53     gu1.Buy();
54     gu2.Buy();
55     gu3.Buy();
56     nd1.Buy();
57     rt1.Buy();
58   }
59 
60   public  void  SellFund()
61   {
62     gu1.Sell();
63     gu2.Sell();
64     gu3.Sell();
65     nd1.Sell();
66     rt1.Sell();
67   }
68 
69 }
70 
71 // 客户端
72 static  void  Main(string[]  args)
73 {
74   Fund  jijin = new Fund();
75 
76   // 基金购买
77   jijin.BuyFund();
78 
79   // 基金赎回
80   jijin.SellFund();
81 
82   Console.Read();
83 }

 

posted @ 2015-06-18 15:58  壬子木  阅读(165)  评论(0)    收藏  举报