後端開發 設計模式 · 第 11 / 24 篇

外觀模式:化繁為簡

外觀模式 (Facade Pattern) 為複雜系統提供統一的簡化介面。本文透過 C# 家庭劇院範例,示範如何讓系統操作更直覺、更好維護。

哈囉大家~今天的主題非常實用,那就是「外觀模式(Facade)」!這個模式可以有效地讓複雜的系統變得簡單又好用,就像你按下遙控器的開機鍵,電視就會自動開啟、調整音量,甚至切換到你最愛的頻道一樣。


🌟 外觀模式是什麼?

外觀模式其實就是為複雜系統提供一個簡單的介面,讓使用者不需要了解複雜的細節,就能輕鬆操作系統內部的功能。

例如,去電影院看電影時,你只需要買一張電影票,電影院就幫你搞定座位安排、播放電影、空調系統等等,這就是外觀模式的概念啦!


🤔 什麼情況適合用外觀模式?

當你遇到以下的狀況時,特別適合使用外觀模式:

  • 系統變得複雜,使用者需要了解太多細節。
  • 想提供一個簡單的介面給使用者,隱藏複雜的內部運作細節。
  • 想降低系統的耦合性,提高易用性與可維護性。

🎬 C# 外觀模式範例

這次我們就用「電影院系統」的例子,來看看外觀模式怎麼運作吧!

🎥 複雜的子系統類別

using System;

/// <summary>
/// 投影機
/// </summary>
public class Projector
{
    /// <summary>
    /// 開啟投影機
    /// </summary>
    public void TurnOn() => Console.WriteLine("投影機已開啟。");

    /// <summary>
    /// 關閉投影機
    /// </summary>
    public void TurnOff() => Console.WriteLine("投影機已關閉。");
}

/// <summary>
/// 音響系統
/// </summary>
public class AudioSystem
{
    /// <summary>
    /// 開啟音響系統
    /// </summary>
    public void TurnOn() => Console.WriteLine("音響系統已開啟。");

    /// <summary>
    /// 關閉音響系統
    /// </summary>
    public void TurnOff() => Console.WriteLine("音響系統已關閉。");
}

/// <summary>
/// 燈光系統
/// </summary>
public class Lights
{
    /// <summary>
    /// 調暗燈光
    /// </summary>
    public void DimLights() => Console.WriteLine("燈光已調暗。");

    /// <summary>
    /// 關閉燈光
    /// </summary>
    public void TurnOff() => Console.WriteLine("燈光已關閉。");

    /// <summary>
    /// 開啟燈光
    /// </summary>
    public void TurnOn() => Console.WriteLine("燈光已開啟。");
}

🎫 建立 Facade(外觀類別)

using System;

/// <summary>
/// 家庭劇院外觀
/// </summary>
public class HomeTheaterFacade
{
    private Projector _projector;
    private AudioSystem _audioSystem;
    private Lights _lights;

    public HomeTheaterFacade()
    {
        _projector = new Projector();
        _audioSystem = new AudioSystem();
        _lights = new Lights();
    }

    /// <summary>
    /// 開始觀賞電影
    /// </summary>
    public void WatchMovie()
    {
        Console.WriteLine("準備觀賞電影...");
        _projector.TurnOn();
        _audioSystem.TurnOn();
        _lights.TurnOff();
    }

    /// <summary>
    /// 結束電影並關閉設備
    /// </summary>
    public void EndMovie()
    {
        Console.WriteLine("電影結束,準備關閉設備...");
        _projector.TurnOff();
        _audioSystem.TurnOff();
        _lights.TurnOn();
    }
}

🚀 實際使用範例

using System;

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

        homeTheater.WatchMovie();

        Console.WriteLine();

        homeTheater.EndMovie();
    }
}

🎯 執行結果

準備觀賞電影...
投影機已開啟。
音響系統已開啟。
燈光已關閉。

電影結束,準備關閉設備...
投影機已關閉。
音響系統已關閉。
燈光已開啟。

⚠️ 外觀模式使用注意事項

  • 優點:簡化客戶端的使用介面、降低系統複雜度。
  • 缺點:Facade 本身可能會變得過於龐大,隱藏了底層細節。

🎉 結語

恭喜你,又掌握了一個好用的設計模式—外觀模式(Facade)!透過這個模式,讓複雜的系統操作變得更簡單直覺,用戶體驗也會更棒喔。

繼續追蹤我們的設計模式系列,一起輕鬆學習更多實用技巧吧!我們下篇再見啦~

系列:

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

設計模式

這篇是系列中的第 11 / 24 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 搞懂設計模式到底是什麼?
  2. 02 單例模式:只要一個就夠!
  3. 03 工廠方法模式:點披薩不用親自下廚
  4. 04 抽象工廠模式:系列產品輕鬆生產
  5. 05 原型模式:複製的藝術
  6. 06 建造者模式:一步步完成複雜任務
  7. 07 介面卡模式:讓不相容也能合作
  8. 08 橋接模式:抽象與實作分離
  9. 09 組合模式:樹狀結構的好幫手
  10. 10 裝飾者模式:讓功能自由加點
  11. 11 外觀模式:化繁為簡 目前閱讀
  12. 12 享元模式:節省記憶體的利器
  13. 13 代理模式:控制存取的守門員
  14. 14 責任鏈模式:層層把關的處理機制
  15. 15 命令模式:靈活封裝的請求指令
  16. 16 解譯器模式:讓程式聽懂你的指令
  17. 17 迭代器模式:輕鬆遍歷集合元素
  18. 18 中介者模式:管理複雜溝通的好幫手
  19. 19 備忘錄模式:保存與恢復物件狀態
  20. 20 觀察者模式:即時通知的好幫手
  21. 21 狀態模式:依狀態改變行為的祕訣
  22. 22 策略模式:靈活切換行為的好幫手
  23. 23 模板方法模式:固定流程靈活實作
  24. 24 訪問者模式:新增功能不動既有架構

Further reading

中介者模式:管理複雜溝通的好幫手 封面圖 2025-06-13 中介者模式:管理複雜溝通的好幫手 備忘錄模式:保存與恢復物件狀態 封面圖 2025-06-13 備忘錄模式:保存與恢復物件狀態 模板方法模式:固定流程靈活實作 封面圖 2025-06-13 模板方法模式:固定流程靈活實作

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 3 分鐘

本篇所在系列 · 第 11 / 24 篇

設計模式

  1. 搞懂設計模式到底是什麼?
  2. 單例模式:只要一個就夠!
  3. 工廠方法模式:點披薩不用親自下廚
  4. 抽象工廠模式:系列產品輕鬆生產
  5. 原型模式:複製的藝術
  6. 建造者模式:一步步完成複雜任務
  7. 介面卡模式:讓不相容也能合作
  8. 橋接模式:抽象與實作分離
  9. 組合模式:樹狀結構的好幫手
  10. 裝飾者模式:讓功能自由加點
  11. 外觀模式:化繁為簡
  12. 享元模式:節省記憶體的利器
  13. 代理模式:控制存取的守門員
  14. 責任鏈模式:層層把關的處理機制
  15. 命令模式:靈活封裝的請求指令
  16. 解譯器模式:讓程式聽懂你的指令
  17. 迭代器模式:輕鬆遍歷集合元素
  18. 中介者模式:管理複雜溝通的好幫手
  19. 備忘錄模式:保存與恢復物件狀態
  20. 觀察者模式:即時通知的好幫手
  21. 狀態模式:依狀態改變行為的祕訣
  22. 策略模式:靈活切換行為的好幫手
  23. 模板方法模式:固定流程靈活實作
  24. 訪問者模式:新增功能不動既有架構
看完整系列 24 篇