【设计模式】中介者模式

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

相关推荐
caimouse2 小时前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
沫璃染墨2 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
刚入门的大一新生2 小时前
Linux-线程互斥
java·开发语言
香芋芋圆2 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
小熊恋旧3 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合3 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J3 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net4 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央4 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>4 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc