閱讀: 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)系如下圖:

2009-12-01_213408 圖1

上圖中的關(guān)系感覺很混亂,場景和子系統(tǒng)之間的耦合度很高,要降低這種耦合度,就要使和場景之間交互的不是這些子系統(tǒng)了,而是相對單一的一個中間層,如下圖:

2009-12-01_214040 圖2

上圖的Facade就將子系統(tǒng)隱藏了,不同的場景都是直接和Facade交互。

動機(jī)

上面圖1方案的問題在于組件的客戶和組件中各種復(fù)雜的子系統(tǒng)有了過多的耦合,隨著外部客戶程序和各子系統(tǒng)的演化,這種過多的耦合面臨很多變化的挑戰(zhàn)。如何簡化外部客戶程序和系統(tǒng)間的交互接口?如何將外部客戶程序的演化和內(nèi)部子系統(tǒng)的變化之間的依賴相互解耦?這就要用到Facade模式,先來看結(jié)構(gòu)圖:

2009-12-01_214616

代碼實現(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ò)展功能。


返回開篇(索引)


作者:oec2003(水杯)
出處:http://oec2003.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

  發(fā)表評論


新聞頻道:擴(kuò)展插件引發(fā)Chrome與Firefox之爭

推薦鏈接:Windows 7專題發(fā)布

網(wǎng)站導(dǎo)航:博客園首頁  個人主頁  新聞  社區(qū)  博問  閃存  知識庫


文章來源:http://www.cnblogs.com/oec2003/archive/2009/12/07/1618997.html