【设计模式】中介者模式

中介者模式(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 界面控件:窗口或对话框类 进行交互,而不是直接相互调用事件处理;

相关推荐
工程师0077 小时前
C# 基于 HSL 与基恩士 PLC 通信
c#·mc协议·基恩士plc
li.wz7 小时前
JDK17 深度解析:从特性实现到生产实践
java·开发语言
冰冰菜的扣jio7 小时前
理解类加载过程
开发语言·python
charlie1145141917 小时前
AVX 指令集系列深度介绍:领域、意义、以及 AVX AVX2 的基本用法与样例
开发语言·c++·人工智能·软件工程·并行计算·avx
zyxqyy&∞7 小时前
python代码小练-4
开发语言·python
charlie1145141917 小时前
如何把 Win32 窗口“置顶”(Windows + C++)
开发语言·c++·windows·笔记·学习·软件工程
luoluoal7 小时前
基于python的反爬虫技术的研究(源码+文档)
开发语言·python·mysql
妮妮喔妮7 小时前
Nextjs的SSR服务器端渲染为什么优化了首屏加载速度?
开发语言·前端·javascript
SmoothSailingT7 小时前
C/C++与C#——指针的作用
开发语言·c++·c