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];
public Engine engine = new Engine();
public Body()
for (int i = 0; i < wheels.Length; i++)
{
wheels[i] = 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[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());
}
現在我們來使用用戶端程式驗證一下,代碼如下:
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 Engine is stoped
BMW's Wheel is stoped
正如上面所說:用戶端代碼(Program)不需要關心子系統,它隻需要關心CarFacade所留下來的和外部互動的接口,而子系統是在CarFacade中聚合。
Façade模式的幾個要點:
1、從客戶程式的角度看,Facade模式不僅簡化了整個元件系統的接口,同時對于元件内部與外部客戶程式來說,從某種程度上也達到了一種“解耦”的效果——内部子系統的任何變化不會影響到Facade接口的變化。
2、Facade設計模式更注重從架構的層次去看整個系統,而不是單個類的層次。Facade很多時候更是一種架構設計模式。