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

中介者模式:管理複雜溝通的好幫手

中介者模式 (Mediator Pattern) 集中管理物件間的溝通,降低耦合度。本文利用 C# 聊天室範例,示範如何簡化複雜的互動關係。

哈囉朋友們~今天要聊的設計模式是中介者模式(Mediator),這個模式能讓你的程式輕鬆管理物件之間複雜的溝通關係。

🌟 中介者模式是什麼?

中介者模式透過一個中介者物件來協調其他物件之間的互動,避免物件間的直接聯繫導致的混亂。

想像你使用聊天室時,你並不直接跟每個使用者對話,而是透過聊天室作為中介,幫你發送訊息給其他使用者,這樣每個人只要與聊天室溝通即可,簡單明瞭。


🤔 什麼情況適合使用中介者模式?

以下情況適合使用中介者模式:

  • 當系統內有許多物件需要彼此溝通,關係變得複雜難以管理。
  • 想降低物件間的耦合度,讓系統容易維護與擴充。
  • 想集中管理物件之間的溝通邏輯。

💬 C# 中介者模式範例:聊天室應用程式

我們透過「聊天室」範例來實際展示中介者模式。

💻 定義中介者介面

/// <summary>
/// 中介者介面
/// </summary>
public interface IChatMediator
{
    /// <summary>
    /// 傳送訊息給其他使用者
    /// </summary>
    /// <param name="message">訊息內容</param>
    /// <param name="user">發送者</param>
    void SendMessage(string message, User user);

    /// <summary>
    /// 註冊使用者到聊天室
    /// </summary>
    /// <param name="user">新使用者</param>
    void RegisterUser(User user);
}

👥 建立具體中介者(聊天室)

using System;
using System.Collections.Generic;

/// <summary>
/// 聊天室中介者,負責轉發訊息
/// </summary>
public class ChatMediator : IChatMediator
{
    private readonly List<User> _users = new();  // 聊天室中的使用者名單

    /// <inheritdoc />
    public void RegisterUser(User user)
    {
        _users.Add(user);
    }

    /// <inheritdoc />
    public void SendMessage(string message, User sender)
    {
        foreach (var user in _users)
        {
            if (user != sender)
            {
                user.Receive(message, sender.Name);
            }
        }
    }
}

🙋 建立使用者(參與者)

using System;

/// <summary>
/// 聊天室使用者
/// </summary>
public class User
{
    /// <summary>
    /// 使用者名稱
    /// </summary>
    public string Name { get; }

    private readonly IChatMediator _chatMediator;  // 中介者

    public User(string name, IChatMediator chatMediator)
    {
        Name = name;
        _chatMediator = chatMediator;
        _chatMediator.RegisterUser(this);
    }

    /// <summary>
    /// 發送訊息
    /// </summary>
    /// <param name="message">要傳送的訊息</param>
    public void Send(string message)
    {
        Console.WriteLine($"{Name} 發送訊息:{message}");
        _chatMediator.SendMessage(message, this);
    }

    /// <summary>
    /// 接收訊息
    /// </summary>
    /// <param name="message">收到的訊息</param>
    /// <param name="senderName">發送者名稱</param>
    public void Receive(string message, string senderName)
    {
        Console.WriteLine($"{Name} 收到來自 {senderName} 的訊息:{message}");
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        ChatMediator chatMediator = new ChatMediator();

        User alice = new User("Alice", chatMediator);
        User bob = new User("Bob", chatMediator);
        User charlie = new User("Charlie", chatMediator);

        alice.Send("大家好!");
        bob.Send("嗨 Alice!");
    }
}

🎯 執行結果

Alice 發送訊息:大家好!
Bob 收到來自 Alice 的訊息:大家好!
Charlie 收到來自 Alice 的訊息:大家好!
Bob 發送訊息:嗨 Alice!
Alice 收到來自 Bob 的訊息:嗨 Alice!
Charlie 收到來自 Bob 的訊息:嗨 Alice!

⚠️ 中介者模式使用注意事項

  • 優點:簡化物件之間的溝通,降低耦合性,系統容易維護。
  • 缺點:中介者物件可能會變得複雜,需注意設計清晰。

🎉 結語

恭喜你掌握了中介者模式(Mediator)!透過這個模式,你的程式將更好管理物件間的互動與溝通,清晰又有彈性。

持續追蹤我們的設計模式系列吧,下篇再見啦~

系列:

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

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

還有疑問

Learning path

設計模式

這篇是系列中的第 18 / 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 分鐘

本篇所在系列 · 第 18 / 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 篇