中介者模式

中介者模式(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开发、聊天系统、事件处理系统等场景中非常有用。

posted @ 2025-04-14 14:43  刘继先  阅读(16)  评论(0)    收藏  举报