中介者模式(Mediator Pattern)
概念:
· 一种行为型设计模式;
· 通过一个中介者对象来封装对象之间的交互;
· 各个对象之间不再直接引用或通信,而是通过中介者转发消息或协调行为;
· 核心思想是所有的对象都通过一个中介者进行交互,避免对象之间形成网状的依赖关系;
UML结构:
+----------------+ | IMediator | <<interface>> +----------------+ | +Send(msg, c) | | +Register(c) | +----------------+ ^ | +------------------------+ | ConcreteMediator | +------------------------+ | -colleagues: List<Colleague> | +------------------------+ | +Send(msg, c) | | +Register(c) | +------------------------+ | --------------------------------- | | | +----------------+ +----------------+ +----------------+ | Colleague | | Colleague | | Colleague | +----------------+ +----------------+ +----------------+ | -mediator | | -mediator | | -mediator | | +Send(msg) | | +Send(msg) | | +Send(msg) | | +Receive(msg) | | +Receive(msg) | | +Receive(msg) | +----------------+ +----------------+ +----------------+ ^ ^ ^ | | | +----------------+ +----------------+ +----------------+ | ConcreteUser | | ConcreteUser | | ConcreteUser | +----------------+ +----------------+ +----------------+ | +Receive(msg) | | +Receive(msg) | | +Receive(msg) | +----------------+ +----------------+ +----------------+代码示例:
cs/// <summary> /// 中介者接口 /// </summary> public interface IMediator { void Send(string message, Colleague colleague); } /// <summary> /// 抽象的同事类 /// </summary> public abstract class Colleague { protected IMediator mediator; public string Name { get; private set; } public Colleague(string name, IMediator mediator) { this.Name = name; this.mediator = mediator; } public void Send(string message) { mediator.Send(message, this); } public abstract void Receive(string message); } /// <summary> /// 具体同事类 /// </summary> public class ConcreteColleague : Colleague { public ConcreteColleague(string name, IMediator mediator) : base(name, mediator) { } public override void Receive(string message) { Console.WrileLine($"{Name} 收到消息: {message}"); } } /// <summary> /// 具体中介者 /// </summary> public class ConcreteMediator : IMediator { private List<Colleague> colleagueList = new(); public void Register(Colleague colleague) { if (!colleague.Contains(Colleague)) colleagueList.Add(colleague); } public void Send(string message, Colleague sender) { foreach (var colleague in colleagueList) { if (colleague != sender) colleague.Receive($"{sender.Name} 说: {message}"); } } } /// <summary> /// 客户端 /// </summary> public class Client { public static void Main() { ConcreteMediator mediator = new ConcreteMediator(); Colleague alice = new ConcreteColleague("Alice", mediator); Colleague bob = new ConcreteColleague("Bob", mediator); Colleague charlie = new ConcreteColleague("Charlie", mediator); mediator.Register(alice); mediator.Register(bob); mediator.Register(charlie); alice.Send("大家好,我是Alice"); bob.Send("你好 Alice,我是Bob"); charlie.Send("你们好,我是Charlie"); } }特点:
优点:· 降低耦合:同事类之间不依赖其他类,只依赖中介者;
· 系统中的对象复杂交互都在中介者中,这便于统一管理;
· 易于拓展和维护:添加新同事或修改逻辑时只需要修改中介者即可 ;
缺点:· 中介者的存在增加了系统的复杂度;
· 中介者又需要维护同事,又需要处理业务逻辑,违背了单一职责原则 ;
适用场景:
· 对象之间通信复杂且紧密的场景 ;
· 希望通过集中管理减少类之间的耦合;
· 希望提供系统的可维护性和可拓展性 ;
举例场景:
· 聊天室系统:用户之间不直接发送消息,而是通过中介者进行转发;
· 飞机调度系统:每架飞机不直接和其他飞机通信,而是通过 空中交通管制中心协调起降;
· GUI 界面控件:窗口或对话框类 进行交互,而不是直接相互调用事件处理;
【设计模式】中介者模式
大飞pkz2025-09-29 9:00
相关推荐
泡海椒29 分钟前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比泡泡鱼(敲代码中)1 小时前
Python 容器类型学习笔记:列表、元组、字典、集合2501_933670791 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解菜鸟~noob2332 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】白远山2 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南shmily麻瓜小菜鸡4 小时前
TDD(测试驱动开发)详解三克的油4 小时前
java-学习1星期八不上发条5 小时前
智能指针是什么?使用场景,循环引用解决办法,面试回答tang_04275 小时前
【Hi.Ltd 专题】第7期:Threading 采集线程、锁与 LRU 缓存OKkankan5 小时前
Python 基础进阶(三):从函数、类到 asyncio 与 FastAPI 后端开发实战