閱讀: 57 評論: 0 作者: oec2003 發(fā)表于 2009-12-07 23:08 原文鏈接
Gof定義
為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)a?ade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
先來看個小例子,假設(shè)我們需要開發(fā)一個坦克模擬系統(tǒng)用于模擬坦克車在各種作戰(zhàn)環(huán)境中的行為,其中坦克系統(tǒng)由引擎、控制器、車輪、車身等各子系統(tǒng)構(gòu)成。就會有下面這些類的產(chǎn)生
public class Wheel{ } public class Engine{ } public class Controller{ } public class BodyWork{ }
不同的場景中的要求都不一樣,可能會用到某些子系統(tǒng),也可能不會用到,這些不同的場景就相當(dāng)是外部接口,這些場景和子系統(tǒng)的關(guān)系如下圖:
上圖中的關(guān)系感覺很混亂,場景和子系統(tǒng)之間的耦合度很高,要降低這種耦合度,就要使和場景之間交互的不是這些子系統(tǒng)了,而是相對單一的一個中間層,如下圖:
上圖的Facade就將子系統(tǒng)隱藏了,不同的場景都是直接和Facade交互。
動機(jī)
上面圖1方案的問題在于組件的客戶和組件中各種復(fù)雜的子系統(tǒng)有了過多的耦合,隨著外部客戶程序和各子系統(tǒng)的演化,這種過多的耦合面臨很多變化的挑戰(zhàn)。如何簡化外部客戶程序和系統(tǒng)間的交互接口?如何將外部客戶程序的演化和內(nèi)部子系統(tǒng)的變化之間的依賴相互解耦?這就要用到Facade模式,先來看結(jié)構(gòu)圖:
代碼實現(xiàn),先定義一些子系統(tǒng)類
public class Wheel { public void WAction1() { } public void WAction2() { } } public class Engine { public void EAction1() { } public void EAction2() { } } public class Controller { public void CAction1() { } public void CAction2() { } } public class BodyWork { public void BAction1() { } public void BAction2() { } }
Facade類,用來組合這些子系統(tǒng)
public class TankFacade { Wheel[] wheels = new Wheel[4]; Engine[] engines = new Engine[4]; BodyWork bodywork = new BodyWork(); Controller controller = new Controller(); public void Start() { //用到子系統(tǒng)中的一個或多個 } public void Stop() { //用到子系統(tǒng)中的一個或多個 } public void Run() { //用到子系統(tǒng)中的一個或多個 } public void Shot() { //用到子系統(tǒng)中的一個或多個 } }
客戶端調(diào)用
public class App { static void Main() { TankFacade facade = new TankFacade(); //可以根據(jù)不同場景的需要來選擇調(diào)用相應(yīng)的方法 //在客戶處之需要使用Facade就可以,不需要知道子系統(tǒng)的實現(xiàn) //就起到了和子系統(tǒng)解耦的作用 facade.Start(); facade.Run(); facade.Shot(); facade.Stop(); } }
Facade模式的幾個要點
從客戶程序的角度來看, Facade模式不僅簡化了整個組件系統(tǒng)的接口,同時對于組件內(nèi)部與外部客戶程序來說,從某種程度上也達(dá)到了一種“解耦”的效果——內(nèi)部子系統(tǒng)的任何變化不會影響到Fa?ade接口的變化。
Fa?ade設(shè)計模式更注重從架構(gòu)的層次去看整個系統(tǒng),而不是單個類的層次。Fa?ade很多時候更是一種架構(gòu)設(shè)計模式。
注意區(qū)分Fa?ade模式、Adapter模式、Bridge模式與Decorator模式。Fa?ade模式注重簡化接口,Adapter模式注重轉(zhuǎn)換接口,Bridge模式注重分離接口(抽象)與其實現(xiàn),Decorator模式注重穩(wěn)定接口的前提下為對象擴(kuò)展功能。

出處:http://oec2003.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
新聞頻道:擴(kuò)展插件引發(fā)Chrome與Firefox之爭
推薦鏈接:Windows 7專題發(fā)布
網(wǎng)站導(dǎo)航:博客園首頁 個人主頁 新聞 社區(qū) 博問 閃存 知識庫
文章來源:http://www.cnblogs.com/oec2003/archive/2009/12/07/1618997.html