Facade面板模式

來源:互聯網
上載者:User
Facade面板模式,是一種結構型模式,它主要解決的問題是:組件的客戶和組件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合面臨很多變化的挑戰。在這裡我想舉一個例子:比如,現在有一輛汽車,我們(客戶程式)要啟動它,那我們就要發動引擎(子系統1),使四個車輪(子系統2)轉動。但是實際中我們並不需要用手推動車輪使其轉動,我們踩下油門,此時汽車再根據一些其他的操作使車輪轉動。油門就好比系統給我們留下的介面,不論汽車是以何種方式轉動車輪,車輪變化成什麼牌子的,我們要開走汽車所要做的還是踩下油門。

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

Façade面板模式的結構大概是這樣的:

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

       我就上面說的那個情形寫一下實現代碼,首先我們要實現三個子系統(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 = new Wheel[4];//執行個體化Wheel類

        public Engine engine = new Engine();//執行個體化engine類

        public Body()

        {

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

            {

                wheels = new Wheel();

            }

        }

}

 

然後,我們再來實現汽車的Facade

class CarFacade

    {

        Body body = new Body();

 

        public void Run()

        {

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

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

            {

                Console.WriteLine(body.wheels.WheelCircumrotate());

            }

        }

 

        public void Stop()

        {

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

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

            {

                Console.WriteLine(body.wheels.WheelStop());

            }

        }

}

 

現在我們來使用用戶端程式驗證一下,代碼如下:

class Program

    {

        static void Main(string[] args)

        {

            CarFacade car = new CarFacade();

            car.Run();

            car.Stop();

            Console.Read();

        }

}

      

       執行結果如下;

       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)不需要關心子系統,它只需要關心CarFacade所留下來的和外部互動的介面,而子系統是在CarFacade中彙總。

 

Façade模式的幾個要點:

       1、從客戶程式的角度看,Facade模式不僅簡化了整個組件系統的介面,同時對於組件內部與外部客戶程式來說,從某種程度上也達到了一種“解耦”的效果——內部子系統的任何變化不會影響到Facade介面的變化。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.