【设计模式】中介者模式

中介者模式(Mediator Pattern)

概念:

· 一种行为型设计模式;

· 通过一个中介者对象来封装对象之间的交互;

· 各个对象之间不再直接引用或通信,而是通过中介者转发消息或协调行为;

· 核心思想是所有的对象都通过一个中介者进行交互,避免对象之间形成网状的依赖关系;

UML结构:

复制代码
                +----------------+
                |   IMediator    |   <<interface>>
                +----------------+
                | +Send(msg, c)  |
                | +Register(c)   |
                +----------------+
                        ^
                        |
            +------------------------+
            |   ConcreteMediator     |
            +------------------------+
            | -colleagues: List<Colleague> |
            +------------------------+
            | +Send(msg, c)          |
            | +Register(c)           |
            +------------------------+
                        |
         ---------------------------------
         |               |               |
+----------------+ +----------------+ +----------------+
|   Colleague    | |   Colleague    | |   Colleague    |
+----------------+ +----------------+ +----------------+
| -mediator      | | -mediator      | | -mediator      |
| +Send(msg)     | | +Send(msg)     | | +Send(msg)     |
| +Receive(msg)  | | +Receive(msg)  | | +Receive(msg)  |
+----------------+ +----------------+ +----------------+
        ^                ^                  ^
        |                |                  |
+----------------+ +----------------+ +----------------+
| ConcreteUser   | | ConcreteUser   | | ConcreteUser   |
+----------------+ +----------------+ +----------------+
| +Receive(msg)  | | +Receive(msg)  | | +Receive(msg)  |
+----------------+ +----------------+ +----------------+

代码示例:

cs 复制代码
/// <summary>
/// 中介者接口
/// </summary>
public interface IMediator
{
    void Send(string message, Colleague colleague);
}

/// <summary>
/// 抽象的同事类
/// </summary>
public abstract class Colleague
{
    protected IMediator mediator;

    public string Name { get; private set; }

    public Colleague(string name, IMediator mediator)
    {
        this.Name = name;
        this.mediator = mediator;
    }

    public void Send(string message)
    {
        mediator.Send(message, this);
    }

    public abstract void Receive(string message);
}

/// <summary>
/// 具体同事类
/// </summary>
public class ConcreteColleague : Colleague
{
    public ConcreteColleague(string name, IMediator mediator) : base(name, mediator) { }

    public override void Receive(string message)
    {
        Console.WrileLine($"{Name} 收到消息: {message}");
    }
}

/// <summary>
/// 具体中介者
/// </summary>
public class ConcreteMediator : IMediator
{
    private List<Colleague> colleagueList = new();

    public void Register(Colleague colleague)
    {
        if (!colleague.Contains(Colleague))
            colleagueList.Add(colleague);
    }

    public void Send(string message, Colleague sender)
    {
        foreach (var colleague in colleagueList)
        {
            if (colleague != sender)
                colleague.Receive($"{sender.Name} 说: {message}");
        }
    }
}

/// <summary>
/// 客户端
/// </summary>
public class Client
{
    public static void Main()
    {
        ConcreteMediator mediator = new ConcreteMediator();

        Colleague alice = new ConcreteColleague("Alice", mediator);
        Colleague bob = new ConcreteColleague("Bob", mediator);
        Colleague charlie = new ConcreteColleague("Charlie", mediator);

        mediator.Register(alice);
        mediator.Register(bob);
        mediator.Register(charlie);

        alice.Send("大家好,我是Alice");
        bob.Send("你好 Alice,我是Bob");
        charlie.Send("你们好,我是Charlie");
    }
}

特点:
优点:

· 降低耦合:同事类之间不依赖其他类,只依赖中介者;

· 系统中的对象复杂交互都在中介者中,这便于统一管理

· 易于拓展和维护:添加新同事或修改逻辑时只需要修改中介者即可
缺点:

· 中介者的存在增加了系统的复杂度

· 中介者又需要维护同事,又需要处理业务逻辑,违背了单一职责原则

适用场景:

· 对象之间通信复杂且紧密的场景

· 希望通过集中管理减少类之间的耦合

· 希望提供系统的可维护性和可拓展性

举例场景:

· 聊天室系统:用户之间不直接发送消息,而是通过中介者进行转发;

· 飞机调度系统:每架飞机不直接和其他飞机通信,而是通过 空中交通管制中心协调起降;

· GUI 界面控件:窗口或对话框类 进行交互,而不是直接相互调用事件处理;

相关推荐
七月丶1 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞1 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼2 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟18 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder19 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
Scout-leaf3 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530143 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
mudtools4 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net