设计模式(八)外观模式
外观模式(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 }

浙公网安备 33010602011771号