外觀模式(Facade),爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。javascript
怎麼叫更加容易使用呢?多個方法變成一個方法,在外觀看來,只需知道這個功能完成哪些功能就OK了,沒必要記得一大堆對象,一大堆方法。html
外觀模式UML圖:java
外觀模式的基本結構代碼:git
namespace ConsoleApplication1 { //四個子系統類 class SubSystemOne { public void MethodOne() { Console.WriteLine("子系統方法一"); } } class SubSystemTwo { public void MethodTwo() { Console.WriteLine("子系統方法二"); } } class SubSystemThree { public void MethodThree() { Console.WriteLine("子系統方法三"); } } class SubSystemFour { public void MethodFour() { Console.WriteLine("子系統方法四"); } } //外觀類 class Facade { SubSystemOne one; //外觀類,它須要瞭解全部的子系統的方法或屬性,進行組合,以被外界調用 SubSystemTwo two; SubSystemThree three; SubSystemFour four; public Facade() { one = new SubSystemOne(); two = new SubSystemTwo(); three = new SubSystemThree(); four = new SubSystemFour(); } public void MethodA() //這樣相對於外部來講,調用MethiodA方法就等於同時調用了3個方法,但外觀看起來是一個方法 { Console.WriteLine("\n方法組A()"); one.MethodOne(); two.MethodTwo(); four.MethodFour(); } public void MethodB() { Console.WriteLine("\n方法組B()"); two.MethodTwo(); three.MethodThree(); } } class Program { static void Main(string[] args) { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); Console.ReadKey(); } } }
回到《大話設計模式》裏的買股票例子:設計模式
namespace ConsoleApplication1 { //股票1 class Stock1 { //賣股票 public void Sell() { Console.WriteLine("股票1賣出"); } //買股票 public void Buy() { Console.WriteLine("股票1買入"); } } //股票2 class Stock2 { //賣股票 public void Sell() { Console.WriteLine("股票2賣出"); } //買股票 public void Buy() { Console.WriteLine("股票2買入"); } } //股票3 class Stock3 { //賣股票 public void Sell() { Console.WriteLine("股票3賣出"); } //買股票 public void Buy() { Console.WriteLine("股票3買入"); } } //國債1 class NationalDebt1 { //賣國債 public void Sell() { Console.WriteLine("國債1賣出"); } //買國債 public void Buy() { Console.WriteLine("國債1買入"); } } //房地產1 class Realty1 { //賣出房產 public void Sell() { Console.WriteLine("房產1賣出"); } //買房產 public void Buy() { Console.WriteLine("房產1買入"); } } class Fund { Stock1 gu1; Stock2 gu2; Stock3 gu3; NationalDebt1 nd1; Realty1 rt1; public Fund() { gu1 = new Stock1(); gu2 = new Stock2(); gu3 = new Stock3(); nd1 = new NationalDebt1(); rt1 = new Realty1(); } public void BuyFund() { gu1.Buy(); gu2.Buy(); gu3.Buy(); nd1.Buy(); rt1.Buy(); } public void SellFund() { gu1.Sell(); gu2.Sell(); gu3.Sell(); nd1.Sell(); rt1.Sell(); } } class Program { static void Main(string[] args) { Fund jijin = new Fund(); //基金購買 jijin.BuyFund(); //基金贖回 jijin.SellFund(); Console.ReadKey(); } } }
如何使用外觀模式:架構
首先,在設計初期階段,應該要有意識的將不一樣的兩個層分離,好比經典的三層架構,就須要考慮在數據訪問層和業務邏輯層、業務邏輯層和表示層的層與層之間創建外觀Facade,這樣能夠爲複雜的子系統提供一個簡單的接口,使得耦合大大下降。post
其次,在開發階段,子系統每每由於不斷的重構演化而變得愈來愈複雜。大多數模式的使用時也會產生不少很小的類,這本是好事,但也給外部調用它們的用戶程序帶來了使用上的困難,增長外觀Facade能夠提供一個簡單的接口,減小它們之間的依賴。學習
最後,在維護一個遺留的大型系統時,可能這個系統已經很是難以維護和擴展了,但由於他包含很是重要的功能,新的需求開發必需要依賴於它。此時用外觀模式Facade也是很是合適的。你能夠爲新系統開發一個外觀Facade類,來提供設計粗糙或高難度複雜的遺留代碼的比較清晰簡單的接口,讓新系統與Facade對象交互,Facade與遺留代碼交互全部複雜工做。this