Franky's LIFE

          Anything... ...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            53 隨筆 :: 87 文章 :: 6 評論 :: 0 Trackbacks

          Facade 外 觀模式,是一種結構型模式,它主要解決的問題是:組件的客戶和組件中各種復雜的子系統(tǒng)有了過多的耦合,隨著外部客戶程序和各子系統(tǒng)的演化,這種過多的耦合 面臨很多變化的挑戰(zhàn)。在這里我想舉一個例子:比如,現(xiàn)在有一輛汽車,我們(客戶程序)要啟動它,那我們就要發(fā)動引擎(子系統(tǒng) 1 ),使四個車輪(子系統(tǒng) 2 )轉動。但是實際中我們并不需要用手推動車輪使其轉動,我們踩下油門,此時汽車再根據(jù)一些其他的操作使車輪轉動。油門就好比系統(tǒng)給我們留下的接口,不論汽車是以何種方式轉動車輪,車輪變化成什么牌子的,我們要開走汽車所要做的還是踩下油門。

          GoF 《設計模式》中說道:為子系統(tǒng)中的一組接口提供一個一致的界面, Facade 模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。

          Fa?ade 外觀模式的結構大概是這樣的:

          ?????? 這個圖是我對 Facade 模式的理解,如果大家覺得有什么不對的地方歡迎給我指出。

          ?????? 我就上面說的那個情形寫一下實現(xiàn)代碼,首先我們要實現(xiàn)三個子系統(tǒng)( Wheel Engine Body ):

          ?????? internal class Engine

          ??? {

          ??????? public string EngineWork()

          ??????? {

          ??????????? return "BMW's Engine is Working";

          ??????? }

          ?

          ??????? public string EngineStop()

          ??????? {

          ??????????? return "BMW's Engine is stoped";

          ??????? }

          ??? }

          ?

          ??? internal class Wheel

          ??? {

          ??????? public string WheelCircumrotate()

          ?????? ?{

          ??????????? return "BMW's Wheel is Circumrotating";

          ??????? }

          ?

          ??????? public string WheelStop()

          ??????? {

          ??????????? return "BMW's Wheel is stoped";

          ??????? }

          ??? }

          ???

          ??? internal class Body

          ??? {

          ??????? public Wheel[] wheels = newWheel[4];

          ??????? public Engine engine = newEngine();

          ??????? public Body()

          ??????? {

          ??????????? for (int i = 0; i < wheels.Length; i++)

          ??????????? {

          ??????????????? wheels[i] = newWheel();

          ??????????? }

          ??????? }

          }

          ?

          然后,我們再來實現(xiàn)汽車的Facade

          class CarFacade

          ??? {

          ??????? Body body = newBody();

          ?

          ??????? public void Run()

          ??????? {

          ??????????? Console.WriteLine(body.engine.EngineWork());

          ??????????? for(int i = 0; i < body.wheels.Length; i++)

          ??????????? {

          ??????????????? Console.WriteLine(body.wheels[i].WheelCircumrotate());

          ? ?????????? }

          ??????? }

          ?

          ??????? public void Stop()

          ??????? {

          ??????????? Console.WriteLine(body.engine.EngineStop());

          ??????????? for (int i = 0; i < body.wheels.Length; i++)

          ??????????? {

          ??????????????? Console.WriteLine(body.wheels[i].WheelStop());

          ??? ????????}

          ??????? }

          }

          ?

          現(xiàn)在我們來使用客戶端程序驗證一下,代碼如下:

          class Program

          ??? {

          ??????? static void Main(string[] args)

          ??????? {

          ??????????? CarFacade car = newCarFacade();

          ??????????? car.Run();

          ??????????? car.Stop();

          ??????????? Console.Read();

          ??????? }

          }

          ??????

          ?????? 執(zhí)行結果如下;

          ?????? BMW's Engine is Working

          BMW's Wheel is Circumrotating

          BMW's Wheel is Circumrotating

          BMW's Wheel is Circumrotating

          BMW's Wheel is Circumrotating

          BMW's Engine is stoped

          BMW's Wheel is stoped

          BMW's Wheel is stoped

          BMW's Wheel is stoped

          BMW's Wheel is stoped

          ?

          正如上面所說:客戶端代碼( Program )不需要關心子系統(tǒng),它只需要關心 CarFacade 所留下來的和外部交互的接口,而子系統(tǒng)是在 CarFacade 中聚合。

          ?

          Fa?ade 模式的幾個要點:

          ?????? 1 、從客戶程序的角度看, Facade 模式不僅簡化了整個組件系統(tǒng)的接口,同時對于組件內(nèi)部與外部客戶程序來說,從某種程度上也達到了一種“解耦”的效果——內(nèi)部子系統(tǒng)的任何變化不會影響到 Facade 接口的變化。

          2 Facade 設計模式更注重從架構的層次去看整個系統(tǒng),而不是單個類的層次。 Facade 很多時候更是一種架構設計模式。

          posted on 2007-03-19 20:57 Franky 閱讀(202) 評論(0)  編輯  收藏 所屬分類: IT知識
          主站蜘蛛池模板: 天峻县| 吉隆县| 天镇县| 五原县| 进贤县| 河津市| 德钦县| 罗源县| 方城县| 微博| 海盐县| 龙井市| 大化| 新闻| 方山县| 嫩江县| 六安市| 利川市| 义马市| 柏乡县| 武清区| 安多县| 濉溪县| 闸北区| 怀来县| 隆昌县| 井冈山市| 通州区| 阳江市| 黄骅市| 凭祥市| 磐安县| 项城市| 彰化县| 广昌县| 嘉鱼县| 策勒县| 巴林左旗| 青浦区| 余姚市| 奉新县|