【设计模式】中介者模式

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

相关推荐
Han_han9192 小时前
常用API:
java·开发语言
minji...2 小时前
Linux 线程同步与互斥(四) POSIX信号量,基于环形队列的生产者消费者模型
linux·运维·服务器·c语言·开发语言·c++
Highcharts.js2 小时前
在 React 中使用 useState 和 @highcharts/react 构建动态图表
开发语言·前端·javascript·react.js·信息可视化·前端框架·highcharts
likerhood2 小时前
java中的return this、链式编程和Builder模式
java·开发语言
田井中律.2 小时前
知识图谱(关系抽取方法)【第十章】
人工智能·c#·知识图谱
原来是猿3 小时前
Linux线程同步与互斥(三):POSIX信号量与环形队列生产者消费者模型
linux·运维·服务器·开发语言
未来转换3 小时前
基于A2A协议的生产应用实践指南(Java)
java·开发语言·算法·agent
Rust语言中文社区3 小时前
【Rust日报】Clone:像进程一样 fork 虚拟机的 Rust KVM VMM
开发语言·后端·rust
求知也求真佳3 小时前
S02|工具使用:让 Agent 真正会干活,添加工具
开发语言·agent
Dwzun3 小时前
基于Java+SpringBoot+Vue的校园二手物品置换系统设计与实现【附源码+文档+部署视频+讲解】
java·开发语言·spring boot