一、定义
中介者模式(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.代码解析
- 中介者接口 IAirTrafficControl:定义飞机注册和消息转发的方法。
- 具体中介者 Tower:管理飞机列表,协调飞机间的通信(如广播警告)。
- 抽象同事类 Aircraft:保存中介者引用,提供发送消息的抽象方法。
- 具体同事类 PassengerAircraft/CargoAircraft:实现接收警告的具体逻辑。
- 客户端:创建塔台和飞机,模拟飞机通过塔台通信的过程。
通过中介者模式,飞机无需直接引用其他飞机对象,仅需与塔台交互,显著降低了耦合度,同时便于扩展新的交互逻辑(如新增紧急降落协调功能)。
