首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式:門面模式完整指南(二)— 實作細節、適用場景與保安系統實戰

     編輯:關於C語言

門面模式實作關鍵點

系統可有多個門面類

  • GoF 指出:每個子系統通常只需一個門面類(單例)
  • 但**整個系統可有多個門面類**(每個子系統一個)

門面模式不為子系統增加新行為

  • 錯誤認知:繼承門面類可為子系統加新行為
  • 正確用意:提供**集中化、簡化的溝通管道**,而非擴展功能

適用場景

  1. 為複雜子系統提供簡單介面
  2. 提高子系統獨立性(降低客戶端耦合)
  3. 層次化架構中定義各層入口

實戰:保安系統門面模式重構

不使用門面模式:客戶端直接操作所有設備


// 客戶端需引用所有設備
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 行統一調用
子系統變更影響直接波及客戶端門面內部吸收,客戶端無感
測試難度需模擬所有設備只需模擬門面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved