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

C# 設計模式精講:外觀模式

     編輯:關於C#

一、外觀模式:為複雜系統提供統一入口

外觀模式要求外部與子系統的溝通必須通過一個統一的外觀對象進行。它提供了一個高層介面,讓子系統更易使用。正如醫院設「接待員」一職,病人只需找接待員,由其代辦掛號、劃價、繳費、取藥等繁瑣流程,屏蔽了內部科室的複雜性。

二、模式結構與角色

外觀模式結構圖

兩大核心角色:

  • 外觀角色:客戶端調用的入口,知曉子系統功能與職責,將請求委派給相應子系統。
  • 子系統角色:由一組類組成,可被客戶端直接調用,也可被外觀調用;子系統不知外觀存在,對其而言外觀只是另一個客戶端。

三、關鍵設計原則

  1. 每個子系統一個外觀類:通常為單例;系統可有多個子系統,故可有多個外觀類。
  2. 外觀不可向子系統添加新行為:其職責是提供簡化溝通管道,而非擴展功能。新行為應在子系統內部實現。

四、適用場景

  • 為複雜子系統提供簡單介面。
  • 提高子系統獨立性,降低客戶端耦合。
  • 層次化結構中,定義各層入口。

五、實戰案例:安防系統控制台

無外觀模式:客戶端直接操作所有設備

無外觀模式結構

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();
    }
}

引入外觀模式:統一控制台

外觀模式結構

public class SecurityFacade {
    private static Camera camera1, camera2;
    private static Light light1, light2, light3;
    private static Sensor sensor;
    private static Alarm alarm;
    static SecurityFacade() {
        camera1 = new Camera(); camera2 = new Camera();
        light1 = new Light(); light2 = new Light(); light3 = new Light();
        sensor = new Sensor(); alarm = new Alarm();
    }
    public void Activate() {
        camera1.TurnOn(); camera2.TurnOn();
        light1.TurnOn(); light2.TurnOn(); light3.TurnOn();
        sensor.Activate(); alarm.Activate();
    }
    public void Deactivate() {
        camera1.TurnOff(); camera2.TurnOff();
        light1.TurnOff(); light2.TurnOff(); light3.TurnOff();
        sensor.Deactivate(); alarm.Deactivate();
    }
}

public class Client {
    private static SecurityFacade security;
    public static void Main() {
        security = new SecurityFacade();
        security.Activate();
        Console.WriteLine("\n--------------------\n");
        security.Deactivate();
    }
}

客戶端代碼大幅簡化,僅需調用 Activate()/Deactivate(),內部協調邏輯封裝於外觀內,易於維護與擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved