中介者模式
中介者模式(Mediator Pattern)
定义
中介者模式是一种 行为设计模式,它用一个中介对象来封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
核心思想
-
解耦直接通信:将网状的对象关系变为星型结构,中介者作为中心节点
-
集中控制:将对象间的交互逻辑集中到中介者中
-
简化对象职责:各个对象只需与中介者通信,无需了解其他对象细节
主要解决的问题
-
对象间复杂耦合:当对象之间存在大量直接关联,导致系统难以复用和修改
-
交互行为难以理解:对象间交互分散在各个类中,难以整体把握
-
多对多通信:多个对象需要相互通信,导致关系网过于复杂
代码示例
- 场景描述
实现一个聊天室系统,多个用户通过聊天室(中介者)进行通信,而不是直接相互联系。
using System;
using System.Collections.Generic;
// 中介者接口
public interface IChatRoomMediator
{
void SendMessage(string message, User user);
void AddUser(User user);
}
// 具体中介者 - 聊天室
public class ChatRoom : IChatRoomMediator
{
private List<User> _users = new List<User>();
public void AddUser(User user)
{
_users.Add(user);
}
public void SendMessage(string message, User sender)
{
foreach (var user in _users)
{
// 不将消息发送给自己
if (user != sender)
{
user.Receive(message);
}
}
}
}
// 抽象同事类
public abstract class User
{
protected IChatRoomMediator _mediator;
public string Name { get; }
public User(IChatRoomMediator mediator, string name)
{
_mediator = mediator;
Name = name;
}
public abstract void Send(string message);
public abstract void Receive(string message);
}
// 具体同事类
public class ChatUser : User
{
public ChatUser(IChatRoomMediator mediator, string name)
: base(mediator, name) {}
public override void Send(string message)
{
Console.WriteLine($"{Name} 发送: {message}");
_mediator.SendMessage(message, this);
}
public override void Receive(string message)
{
Console.WriteLine($"{Name} 接收: {message}");
}
}
// 客户端代码
class Program
{
static void Main(string[] args)
{
// 创建中介者
var chatroom = new ChatRoom();
// 创建用户并注册到中介者
var user1 = new ChatUser(chatroom, "张三");
var user2 = new ChatUser(chatroom, "李四");
var user3 = new ChatUser(chatroom, "王五");
chatroom.AddUser(user1);
chatroom.AddUser(user2);
chatroom.AddUser(user3);
// 用户通过中介者通信
user1.Send("大家好!");
user2.Send("欢迎新人!");
user3.Send("今天天气不错");
/* 输出:
张三 发送: 大家好!
李四 接收: 大家好!
王五 接收: 大家好!
李四 发送: 欢迎新人!
张三 接收: 欢迎新人!
王五 接收: 欢迎新人!
王五 发送: 今天天气不错
张三 接收: 今天天气不错
李四 接收: 今天天气不错
*/
}
}
总结
优点
-
降低耦合度:将对象间的多对多关系变为一对多关系
-
简化对象协议:用中介者和同事的一对多交互替代多对多交互
-
集中控制:将交互行为集中在一个中介者对象中
-
提高复用性:各同事类可被复用,因其不直接引用其他对象
缺点
-
中介者可能变得复杂:随着交互逻辑增加,中介者可能变成"上帝对象"
-
性能影响:所有通信都要通过中介者,可能影响性能
适用场景
-
系统中对象之间存在复杂的引用关系
-
想通过中间类封装多个类中的行为,又不想生成太多子类
-
多个类相互依赖,形成了网状结构
-
中介者模式在GUI开发、聊天系统、事件处理系统等场景中非常有用。

浙公网安备 33010602011771号