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

C# 設計模式深度解析:外觀模式 讓複雜子系統一鍵呼叫

     編輯:關於C語言

情境引入:家庭影院的操作噩夢

想像你擁有一套家庭影院系統,包含:

  • 投影機
  • 螢幕
  • 功放機
  • DVD 播放機
  • 燈光控制

每次想看電影,都得依序手動開啟五個裝置;散場時再依序關閉。若順序搞錯或遺漏步驟,體驗大打折扣。這正是軟體開發中「客戶端直接依賴眾多子系統」的寫照——高耦合、難維護、易出錯。

外觀模式 解決之道

定義:為子系統中的一組介面提供一個一致的高層介面,使子系統更容易使用。

外觀模式並不封殺原有子系統,只是提供一個「簡化入口」。客戶端若需進階功能,仍可直接呼叫子系統;但 90% 的常規操作(如「開啟電影模式」、「關閉電影模式」)只需一行程式碼。

類別結構圖

外觀模式結構圖

完整程式碼實作

1. 子系統類別

// 投影機
public class Projector
{
    public void OpenProjector() => Console.WriteLine("打開投影儀");
    public void CloseProjector() => Console.WriteLine("關閉投影儀");
    public void SetWideScreen() => Console.WriteLine("投影儀狀態為寬屏模式");
    public void SetStandardScreen() => Console.WriteLine("投影儀狀態為標準模式");
}

// 功放機
public class Amplifier
{
    public void OpenAmplifier() => Console.WriteLine("打開功放機");
    public void CloseAmplifier() => Console.WriteLine("關閉功放機");
}

// 螢幕
public class Screen
{
    public void OpenScreen() => Console.WriteLine("打開螢幕");
    public void CloseScreen() => Console.WriteLine("關閉螢幕");
}

// DVD 播放機
public class DVDPlayer
{
    public void OpenDVDPlayer() => Console.WriteLine("打開 DVD 播放器");
    public void CloseDVDPlayer() => Console.WriteLine("關閉 DVD 播放器");
}

// 燈光
public class Light
{
    public void OpenLight() => Console.WriteLine("打開燈光");
    public void CloseLight() => Console.WriteLine("關閉燈光");
}

2. 外觀類別

public class HomeTheaterFacade
{
    private readonly Projector _projector = new Projector();
    private readonly Amplifier _amplifier = new Amplifier();
    private readonly Screen _screen = new Screen();
    private readonly DVDPlayer _dvdPlayer = new DVDPlayer();
    private readonly Light _light = new Light();

    /// 一鍵開啟觀影模式
    public void WatchMovie()
    {
        Console.WriteLine("=== 正在準備觀影環境 ===");
        _projector.OpenProjector();
        _projector.SetWideScreen();
        _amplifier.OpenAmplifier();
        _screen.OpenScreen();
        _dvdPlayer.OpenDVDPlayer();
        _light.CloseLight(); // 觀影通常關燈
        Console.WriteLine("=== 環境就緒,享受電影 ===");
    }

    /// 一鍵關閉所有設備
    public void EndMovie()
    {
        Console.WriteLine("=== 正在關閉觀影環境 ===");
        _light.OpenLight();
        _dvdPlayer.CloseDVDPlayer();
        _screen.CloseScreen();
        _amplifier.CloseAmplifier();
        _projector.CloseProjector();
        Console.WriteLine("=== 所有設備已關閉 ===");
    }
}

3. 客戶端呼叫

class Program
{
    static void Main(string[] args)
    {
        var theater = new HomeTheaterFacade();

        // 簡單到只需一行
        theater.WatchMovie();
        
        // ... 觀影中可直接操作子系統進階功能
        theater._projector.SetStandardScreen(); // 切換回標準模式
        
        theater.EndMovie();
        Console.ReadKey();
    }
}

模式優缺點權衡

優點缺點
✅ 解耦客戶端與子系統
✅ 簡化介面,降低使用門檻
✅ 符合「最少知識原則」
⚠️ 新增子系統可能需修改外觀類(違反開閉原則)
⚠️ 若外觀過於龐大,可能成為「上帝類」

適用場景

  • 為複雜子系統提供簡單入口
  • 分層架構中定義層級入口(如三層架構的 Service Layer)
  • 重構舊系統時,以外觀包裝舊介面供新系統呼叫

總結

外觀模式以「一個高層介面」隱藏「一群低層操作」,是降低系統耦合度、提升開發體驗的利器。記住:它是簡化入口,而非隔離牆——需要時隨時可繞過外觀直達子系統。

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