系統的複雜度
假設我們需要開發一個坦克類比系統用於類比坦克車在各種作戰環境中的行為,其中坦克系統由引擎、控制器、車輪、車身等各子系統構成。
public class Wheel
{
public void WAction1() {....}
public void WAction2() {....}
}
public class Engine
{
public void EAction1() {....}
public void EAction2() {....}
}
public class Bodywork
{
public void BAction1() {....}
public void BAction2() {....}
}
public class Controller
{
public void CAction1() {....}
public void CAction2() {....}
}
如何使用這樣的系統
A方案 B方案
動機(Motivation)
上述A方案的問題在於組件的客戶和組件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合面臨很多變化的
挑戰。
如何簡化外部客戶程式和系統間的互動介面?如何將外部客戶程式的演化和內部子系統的變化之間的依賴相互解耦?
意圖(Intent)
為子系統中的一組介面提供一個一致的介面,Façade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。——《設計模式》GoF
結構(Structure)
範例程式碼
代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace testWpf
{
internal class Whell
{
public void WAction1()
{
}
public void WAction2()
{
}
}
internal class Engine
{
public void EAction1()
{
}
public void EAction2()
{
}
}
internal class Bodywork
{
public void BActino1()
{
}
public void Baction2()
{
}
}
internal class Controller
{
public void CActino1()
{
}
public void Caction2()
{
}
}
//Facade
public class TankFacade
{
Whell[] whells = new Whell[4];
Engine[] engines = new Engine[4];
Bodywork bodywork = new Bodywork();
Controller controller = new Controller();
public void Start()
{
//...
}
public void Run()
{
}
public void Shot()
{
}
}
}
Facade模式的幾個要點
- 從客戶程式的角度來看, Facade模式不僅簡化了整個組件系統的介面,同時對於組件內部與外部客戶程式來說,從某種程度上也達到了一種“解耦”的效果——內部子系統的任何變化不會影響到Façade介面的變化。
- Façade設計模式更注重從架構的層次去看整個系統,而
不是單個類的層次。Façade很多時候更是一種架構設計
模式。
- 注意區分Façade模式、Adapter模式、Bridge模式與Decorator模式。Façade模式注重簡化介面,Adapter模式注重轉換介面,Bridge模式注重分離介面(抽象)與其實現,Decorator模式注重穩定介面的前提下為對象擴充功能。