門面模式實作關鍵點
系統可有多個門面類
- GoF 指出:每個子系統通常只需一個門面類(單例)
- 但**整個系統可有多個門面類**(每個子系統一個)
門面模式不為子系統增加新行為
- 錯誤認知:繼承門面類可為子系統加新行為
- 正確用意:提供**集中化、簡化的溝通管道**,而非擴展功能
適用場景
- 為複雜子系統提供簡單介面
- 提高子系統獨立性(降低客戶端耦合)
- 層次化架構中定義各層入口
實戰:保安系統門面模式重構
不使用門面模式:客戶端直接操作所有設備

// 客戶端需引用所有設備
public class Client
{
private static Camera camera1, camera2;
private static Light light1, light2, light3;
private static Sensor sensor;
private static Alarm alarm;
static Client()
{
camera1 = new Camera(); camera2 = new Camera();
light1 = new Light(); light2 = new Light(); light3 = new Light();
sensor = new Sensor(); alarm = new Alarm();
}
public static void Main()
{
camera1.TurnOn(); camera2.TurnOn();
light1.TurnOn(); light2.TurnOn(); light3.TurnOn();
sensor.Activate(); alarm.Activate();
}
}
使用門面模式:引入 SecurityFacade
public class SecurityFacade
{
private Camera camera1, camera2;
private Light light1, light2, light3;
private Sensor sensor;
private Alarm alarm;
public SecurityFacade()
{
camera1 = new Camera(); camera2 = new Camera();
light1 = new Light(); light2 = new Light(); light3 = new Light();
sensor = new Sensor(); alarm = new Alarm();
}
public void ActivateAll()
{
camera1.TurnOn(); camera2.TurnOn();
light1.TurnOn(); light2.TurnOn(); light3.TurnOn();
sensor.Activate(); alarm.Activate();
}
public void DeactivateAll()
{
camera1.TurnOff(); camera2.TurnOff();
light1.TurnOff(); light2.TurnOff(); light3.TurnOff();
sensor.Deactivate(); alarm.Deactivate();
}
}
// 客戶端極度簡化
public class Client
{
private static SecurityFacade facade = new SecurityFacade();
public static void Main()
{
facade.ActivateAll(); // 一鍵啟動全系統
// ...
facade.DeactivateAll(); // 一鍵關閉全系統
}
}
重構效果對比
| 維度 | 無門面 | 有門面 |
| 客戶端依賴 | 7 個具體類別 | 1 個門面類別 |
| 啟動代碼 | 7 行分散調用 | 1 行統一調用 |
| 子系統變更影響 | 直接波及客戶端 | 門面內部吸收,客戶端無感 |
| 測試難度 | 需模擬所有設備 | 只需模擬門面 |