.NET 设计模式—中介者模式(Mediator Pattern)

简介

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

简单来说,就是用一个中介对象来封装一系列的对象交互,使各个对象不需要显式地互相引用,从而达到了减少耦合的目的,同时也能让它们之间交互独立地变化。

角色

  • Mediator(中介者):通过定义一个接口与各同事对象进行通信。
  • ConcreteMediator(具体中介者):是中介者的具体实现,需要知道所协调的同事对象,用来协调各同事对象之间的行为。
  • Colleague(同事接口):定义了通过中介者与其他同事进行通信的接口
  • ConcreteColleague(具体同事类):同事接口的实现类,当一个同事对象需要与其他同事进行通信时,将统一通过中介者来进行通信。上文中提到的Controller与Repository都属于Colleague。

优点

  • 降低了类的复杂度,将一对多转化成了一对一。
  • 各个类之间的解耦。
  • 符合迪米特原则。

缺点

  • 中介者会庞大,变得复杂难以维护。

应用场景

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

实现

  • 定义一个中介者接口(IMediator)
public interface IMediator
{
    void Register(ISender sender);
    void SendMessage(string message, ISender sender, IReceiver receiver);
}
  • 定义发送者和接收者的接口
public interface ISender
{
    IMediator Mediator { get; set; }
    string Name { get; }
    void Send(string message);
}
 
public interface IReceiver
{
    string Name { get; }
    void Receive(string message);
}
  • 实现具体的发送者和接收者类
public class ConcreteSender : ISender
{
    public IMediator Mediator { get; set; }
    public string Name { get; } = "SenderA"; // 或者其他名称,根据实际情况来定。
    public void Send(string message) => Mediator.SendMessage(message, this, null); // 通过中介者发送消息。
}
 
public class ConcreteReceiver : IReceiver
{
    public string Name { get; } = "ReceiverB"; // 或者其他名称。
    public void Receive(string message) => Console.WriteLine($"{Name} received: {message}"); // 处理接收到的消息。
}
  • 实现中介者类
public class ConcreteMediator : IMediator
{
    private List<ISender> _senders = new List<ISender>(); // 存储所有发送者。
    private IReceiver _receiver; // 存储接收者。这里可以存储多个接收者,根据实际需求来设计。
    private Dictionary<ISender, List<string>> _messages = new Dictionary<ISender, List<string>>(); // 可选,用于存储发送者和他们发送的消息历史。
 
    public void Register(ISender sender) => _senders.Add(sender); // 注册发送者。
    public void SendMessage(string message, ISender sender, IReceiver receiver) // 发送消息给接收者。这里可以添加逻辑来处理消息的传递和存储等。
    {
        if (receiver != null) // 如果需要确保消息只发送给特定的接收者,可以添加相应的逻辑。这里为了简单起见,直接传递消息给接收者。
        {
            receiver.Receive(message); // 调用接收者的Receive方法处理消息。
        }
        // 可以添加额外的逻辑,比如通知其他接收者、记录日志等。这里只是简单演示了基本功能。
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉量*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值