113、23种设计模式之中介者模式(21/23)

一、定义

中介者模式(Mediator Pattern)是一种行为型设计模式,通过引入一个中介对象(Mediator)来封装一组对象之间的交互逻辑,使对象之间不再直接通信,而是通过中介者间接交互。其核心思想是将复杂的网状依赖关系转化为星形结构,降低对象间的耦合度,提升系统的可维护性和扩展性。

二、应用场景

1.复杂对象交互

  • 聊天室系统:用户(同事类)通过聊天室(中介者)发送消息,无需直接引用其他用户对象。
  • GUI组件交互:按钮点击后触发文本框清空、列表刷新,通过窗口(中介者)协调组件行为。
  • 游戏战斗系统:玩家、怪物、道具的交互通过战斗管理器(中介者)计算伤害、判定胜负。

2.多对多依赖关系

  • 订单处理系统:订单、库存、支付、物流等模块通过"订单中介者"协调交互(如支付成功后扣减库存、创建物流)。
  • 智能家居系统:灯光、空调、窗帘通过"中控系统(中介者)"联动(如"离家模式"触发所有设备关闭)。

3.解耦需求

  • 当对象间存在复杂引用关系,导致结构混乱且难以复用时,中介者模式可集中管理交互逻辑,避免直接依赖。

三、优缺点

1.优点

(1)降低耦合度:对象间不再直接引用,仅依赖中介者,减少修改时的"牵一发而动全身"。

(2)提高灵活性:可独立修改对象间的交互方式,无需修改对象本身代码。

(3)简化维护:交互逻辑集中管理,新增交互或修改现有逻辑时,仅需调整中介者。

2.缺点

(1)中介者膨胀风险:当同事类过多时,中介者需处理大量交互逻辑,可能变得复杂难以维护。

(2)性能瓶颈:所有交互需通过中介者转发,可能成为系统性能瓶颈。

(3)间接通信降低效率:相比直接通信,中介者模式可能增加通信延迟。

四、C#代码实例:航空管制系统

以下示例模拟飞机(同事类)通过塔台(中介者)协调通信的场景:

1.代码实例

csharp 复制代码
using System;
using System.Collections.Generic;

// 1. 定义中介者接口
public interface IAirTrafficControl
{
    void RegisterAircraft(Aircraft aircraft);
    void SendWarningMessage(string message, Aircraft sender);
}

// 2. 实现具体中介者(塔台)
public class Tower : IAirTrafficControl
{
    private List<Aircraft> _aircrafts = new List<Aircraft>();

    public void RegisterAircraft(Aircraft aircraft)
    {
        if (!_aircrafts.Contains(aircraft))
        {
            _aircrafts.Add(aircraft);
            aircraft.AirTrafficControl = this;
            Console.WriteLine($"飞机 {aircraft.Name} 已注册到塔台");
        }
    }

    public void SendWarningMessage(string message, Aircraft sender)
    {
        Console.WriteLine($"塔台收到来自 {sender.Name} 的警告: {message}");
        // 广播给其他飞机
        foreach (var aircraft in _aircrafts)
        {
            if (aircraft != sender)
            {
                aircraft.ReceiveWarning(message);
            }
        }
    }
}

// 3. 定义抽象同事类(飞机)
public abstract class Aircraft
{
    public string Name { get; }
    public IAirTrafficControl AirTrafficControl { get; set; }

    protected Aircraft(string name)
    {
        Name = name;
    }

    public void Send(string message)
    {
        AirTrafficControl.SendWarningMessage(message, this);
    }

    public abstract void ReceiveWarning(string message);
}

// 4. 实现具体同事类(客机/货机)
public class PassengerAircraft : Aircraft
{
    public PassengerAircraft(string name) : base(name) { }

    public override void ReceiveWarning(string message)
    {
        Console.WriteLine($"客机 {Name} 收到警告: {message}");
        // 采取措施(如调整航线)
    }
}

public class CargoAircraft : Aircraft
{
    public CargoAircraft(string name) : base(name) { }

    public override void ReceiveWarning(string message)
    {
        Console.WriteLine($"货机 {Name} 收到警告: {message}");
        // 采取措施(如检查货物固定)
    }
}

// 5. 客户端测试
class Program
{
    static void Main(string[] args)
    {
        // 创建塔台(中介者)
        var tower = new Tower();

        // 创建飞机(同事类)
        var flight1 = new PassengerAircraft("CA123");
        var flight2 = new CargoAircraft("UPS456");
        var flight3 = new PassengerAircraft("UA789");

        // 注册飞机到塔台
        tower.RegisterAircraft(flight1);
        tower.RegisterAircraft(flight2);
        tower.RegisterAircraft(flight3);

        Console.WriteLine("\n模拟飞机通讯:");
        flight1.Send("发动机出现异常");
        flight2.Send("遇到强气流");

        /* 输出示例:
        飞机 CA123 已注册到塔台
        飞机 UPS456 已注册到塔台
        飞机 UA789 已注册到塔台

        模拟飞机通讯:
        塔台收到来自 CA123 的警告: 发动机出现异常
        货机 UPS456 收到警告: 发动机出现异常
        客机 UA789 收到警告: 发动机出现异常
        塔台收到来自 UPS456 的警告: 遇到强气流
        客机 CA123 收到警告: 遇到强气流
        客机 UA789 收到警告: 遇到强气流
        */
    }
}

2.代码解析

  1. 中介者接口 IAirTrafficControl:定义飞机注册和消息转发的方法。
  2. 具体中介者 Tower:管理飞机列表,协调飞机间的通信(如广播警告)。
  3. 抽象同事类 Aircraft:保存中介者引用,提供发送消息的抽象方法。
  4. 具体同事类 PassengerAircraft/CargoAircraft:实现接收警告的具体逻辑。
  5. 客户端:创建塔台和飞机,模拟飞机通过塔台通信的过程。

通过中介者模式,飞机无需直接引用其他飞机对象,仅需与塔台交互,显著降低了耦合度,同时便于扩展新的交互逻辑(如新增紧急降落协调功能)。

相关推荐
心语星光1 小时前
23种经典设计模式
设计模式
ACE19851 天前
AI Agent 设计模式深度解析:提示链(Prompt Chaining)模式
人工智能·设计模式·prompt
明洞日记1 天前
【设计模式手册012】责任链模式 - 请求处理的流水线艺术
java·设计模式·责任链模式
ada0_ada11 天前
行为型模式:①责任链模式(Chain of Responsibility Pattern)
设计模式
口袋物联1 天前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
phdsky1 天前
【设计模式】抽象工厂模式
c++·设计模式·抽象工厂模式
7***37451 天前
Java设计模式之工厂
java·开发语言·设计模式
雨中飘荡的记忆1 天前
设计模式之原型模式
设计模式
LengineerC1 天前
Rust仿node事件总线的简单实现
设计模式·rust