简介
中介者模式(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方法处理消息。
}
// 可以添加额外的逻辑,比如通知其他接收者、记录日志等。这里只是简单演示了基本功能。
}
}