.Net行为型设计模式之中介者模式(Mediator)
中介者模式是一种行为型设计模式,它的目的是减少对象之间的耦合度,增强对象之间的协作性,从而提高整个系统的灵活性和可维护性。
在中介者模式中,对象之间的通信都是通过中介者进行的,而不是直接相互引用。这样一来,系统中的每个对象都只需要跟中介者通信,而不用关心其他对象的存在,使得系统更加松耦合,也更加容易扩展和维护。
笔记内容
本篇笔记将主要介绍中介者模式的基本概念和设计思想,以及如何在 .Net 中使用这种模式。
本篇笔记以下述场景为例:假设现在有一个简单的聊天系统,由多个用户组成,每个用户可以向其他用户发送消息。
基本结构
在中介者模式中,主要包括以下几个角色:
- Mediator(中介者):它定义了一个接口,声明了各种交互方法,同时它还可以知道所有具体的同事对象,并负责协调相互通信之间的具体实现,以及各个同事类的关系。
- ConcreteMediator(具体中介者):它是中介者模式的实现者,负责协调具体的同事类之间的通信,通过中介者对各个同事类之间的交互进行统一管理和调度。
- Colleague(同事类):定义了同事类的共有方法,它们是相互依赖的对象,需要相互通信,但是它们并不知道具体的实现细节,只知道中介者交互的一些通用接口。
- ConcreteColleague(具体同事类):是实现 Colleague 接口的具体类,它们之间可以相互通信,知道自己的中介者对象,处理自己的行为,同时也需要处理其他同事类发来的请求。
中介者模式示例
在聊天系统中,中介者的角色可以被定义为一个“聊天室”的概念,而同事对象则是指聊天系统中的各个用户。这里将给出一个简单的示例,来说明如何实现一个基于中介者模式的聊天系统。
中介者类
首先,让我们看看如何定义中介者类:
interface IChatRoomMediator
{
void SendMessage(string message, IUser user);
}
class ChatRoomMediator : IChatRoomMediator
{
public void SendMessage(string message, IUser user)
{
Console.WriteLine($"[{user.Name}] said: {message}");
}
}
在这里,我们定义了一个名为 IChatRoomMediator
的接口,并且定义了唯一的一个方法 SendMessage
。这个方法接收两个参数:消息内容和要发送这条消息的用户。
接下来,我们定义一个具体中介者类 ChatRoomMediator
,它实现了 IChatRoomMediator
接口,并实现了 SendMessage
方法,用来将用户发送的消息输出到控制台。
同事类
接下来是同事类。在聊天系统中,每个用户都是同事类的一个实例。这里先定义一个用户接口,然后再具体实现两个用户类:
interface IUser
{
void SendMessage(string message);
string Name { get; }
}
class SimpleUser : IUser
{
private readonly IChatRoomMediator mediator;
public SimpleUser(IChatRoomMediator mediator, string name)
{
this.mediator = mediator;
Name = name;
}
public void SendMessage(string message)
{
mediator.SendMessage(message, this);
}
public string Name { get; }
}
class VIPUser : IUser
{
private readonly IChatRoomMediator mediator;
public VIPUser(IChatRoomMediator mediator, string name)
{
this.mediator = mediator;
Name = name;
}
public void SendMessage(string message)
{
mediator.SendMessage($"[VIP] {message}", this);
}
public string Name { get; }
}
在这里,我们定义了一个 IUser
接口,其中包含了一个 SendMessage
方法和一个只读属性 Name
。
接下来,我们定义两个具体的用户类 SimpleUser
和 VIPUser
,它们实现了 IUser
接口,并且在 SendMessage
方法中调用了中介者对象的 SendMessage
方法,将自己发送的消息传递给中介者。
需要注意的是,VIPUser
类在发送消息时会在消息前面添加一个 “[VIP]” 的标识,这里只是为了演示而添加的。
使用中介者模式
现在,我们就可以使用中介者模式了。我们可以创建一个中介者对象并将它传递给每个用户对象,然后用户对象就可以通过中介者对象来发送和接收消息了。
以下是一个使用中介者模式的示例:
var chatRoom = new ChatRoomMediator();
var user1 = new SimpleUser(chatRoom, "Tom");
var user2 = new SimpleUser(chatRoom, "Jerry");
var user3 = new VIPUser(chatRoom, "Spike");
user1.SendMessage("Hi, Jerry!");
user2.SendMessage("Hi, Tom!");
user3.SendMessage("Hello, everyone!");
在这里,我们定义了一个 ChatRoomMediator
对象,并分别创建了三个用户对象 user1
、user2
和 user3
。
接着,我们分别调用了每个用户对象的 SendMessage
方法,来模拟在聊天室中发送消息的过程。
输出结果如下:
[Tom] said: Hi, Jerry!
[Jerry] said: Hi, Tom!
[VIP] Hello, everyone!
从输出结果可以看出,中介者对象成功地将用户发送的消息传递到了目标用户。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之中介者模式(Mediator) - Python技术站