当前位置: 首页 > backend >正文

Java行为型模式---中介者模式

中介者模式基础概念

中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而降低耦合度,并可以独立地改变它们之间的交互。中介者模式将多对多的交互转化为一对多的交互,集中控制对象间的通信。

中介者模式的核心组件

  1. 抽象中介者(Mediator) - 定义中介者与同事对象之间的通信接口。
  2. 具体中介者(ConcreteMediator) - 实现抽象中介者接口,协调各同事对象之间的交互,持有所有同事对象的引用。
  3. 抽象同事类(Colleague) - 定义同事类的公共接口,每个同事对象都知道其中介者对象,并通过中介者进行通信。
  4. 具体同事类(ConcreteColleague) - 实现抽象同事类,只知道中介者而不知道其他同事对象,通过中介者与其他同事通信。

中介者模式的实现

下面通过一个简单的聊天室示例展示中介者模式的实现:

// 1. 抽象中介者
interface ChatMediator {void sendMessage(String message, User user);void addUser(User user);
}// 2. 具体中介者 - 聊天室
class ChatRoom implements ChatMediator {private List<User> users = new ArrayList<>();@Overridepublic void sendMessage(String message, User user) {// 中介者负责消息的转发for (User u : users) {if (u != user) {  // 不发送给自己u.receiveMessage(message);}}}@Overridepublic void addUser(User user) {users.add(user);}
}// 3. 抽象同事类 - 用户
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receiveMessage(String message);
}// 4. 具体同事类 - 普通用户
class NormalUser extends User {public NormalUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(name + " 发送消息: " + message);mediator.sendMessage(message, this);  // 通过中介者发送消息}@Overridepublic void receiveMessage(String message) {System.out.println(name + " 收到消息: " + message);}
}// 5. 具体同事类 - VIP用户
class VIPUser extends User {public VIPUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println("[VIP] " + name + " 发送消息: " + message);mediator.sendMessage("[VIP] " + message, this);  // VIP消息添加特殊标识}@Overridepublic void receiveMessage(String message) {System.out.println(name + " 收到消息: " + message);}
}// 6. 客户端代码
public class MediatorPatternClient {public static void main(String[] args) {// 创建中介者ChatMediator chatRoom = new ChatRoom();// 创建同事对象User user1 = new NormalUser(chatRoom, "张三");User user2 = new NormalUser(chatRoom, "李四");User user3 = new VIPUser(chatRoom, "王五");// 将同事添加到中介者chatRoom.addUser(user1);chatRoom.addUser(user2);chatRoom.addUser(user3);// 发送消息user1.send("大家好!");System.out.println();user3.send("欢迎加入聊天室!");}
}

中介者模式的应用场景

  1. 系统中对象间依赖复杂 - 当对象间存在大量的相互引用和交互,导致依赖关系混乱时
  2. 集中控制交互 - 需要集中控制多个对象间的交互逻辑时
  3. MVC 架构 - 控制器(Controller)作为视图(View)和模型(Model)的中介
  4. GUI 组件交互 - 如窗口中多个组件间的联动
  5. 消息队列系统 - 消息中间件作为生产者和消费者的中介
  6. 多人游戏 - 游戏服务器作为玩家之间的中介,处理消息转发

中介者模式的优缺点

优点

  • 降低耦合度 - 对象间无需显式引用,减少了对象间的依赖关系
  • 集中控制交互 - 将交互逻辑集中在中介者中,便于维护和修改
  • 符合开闭原则 - 可以在不修改现有同事类的情况下,通过扩展中介者类来新增交互方式
  • 简化对象协议 - 将多对多的交互转化为一对多的交互,简化了通信协议
  • 便于复用 - 单个同事类可以在不同的中介者环境中复用

缺点

  • 中介者类膨胀 - 中介者承担了过多的交互逻辑,可能变得复杂庞大
  • 维护难度增加 - 中介者类的修改可能影响多个同事类,增加维护风险
  • 系统响应变慢 - 所有交互都通过中介者,可能导致系统响应性能下降
  • 违反单一职责原则 - 中介者类可能负责过多的功能,导致职责不清晰
  • 调试困难 - 中介者中的交互逻辑可能复杂,导致调试困难

使用中介者模式的注意事项

  1. 控制中介者复杂度 - 避免中介者类过于庞大,可将部分逻辑分解为更小的组件
  2. 合理设计中介者接口 - 确保中介者接口清晰,不包含无关功能
  3. 避免过度使用 - 仅在对象间交互复杂且需要集中控制时使用中介者模式
  4. 与观察者模式结合 - 中介者模式可以与观察者模式结合,实现事件驱动的交互
  5. 考虑性能影响 - 对于高性能要求的系统,需谨慎使用中介者模式
  6. 测试中介者 - 由于中介者集中了大量逻辑,应对其进行充分测试

总结

中介者模式通过引入一个中介对象来封装对象间的交互,将多对多的依赖关系转化为一对多的关系,从而降低系统的耦合度,提高可维护性和可扩展性。它在需要集中控制对象交互的场景中尤为有用,如 GUI 系统、消息队列、多人游戏等。合理使用中介者模式可以使系统结构更加清晰,但需注意控制中介者类的复杂度,避免其成为系统的瓶颈。

http://www.xdnf.cn/news/15810.html

相关文章:

  • [故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • BeanFactory 和 FactoryBean 的区别
  • Java行为型模式---访问者模式
  • 用Dynamic chunk去干掉tokenizer?
  • 从零入门:云迁移原理详解与华为Rainbow实战指南
  • 数据结构 队列
  • 信息系统风险的安全技术防范思路
  • 教育科技内容平台的破局之路:从组织困境到 UGC 生态的构建
  • CCF编程能力等级认证GESP—C++7级—20250628
  • [FFmpeg] AVFormatContext、AVInputFormat、AVOutputFormat | libavformat
  • 为任意Java程序配置Socks5与HTTP代理的方法
  • 2025年水安备考:水利水电安全员C类考试题
  • 基于Scrapy-Redis的分布式爬虫系统:工业级实现与深度优化
  • nodejs值process.kill
  • CCF编程能力等级认证GESP—C++8级—20250628
  • 信息学奥赛一本通 1579:【例 5】皇宫看守 | 洛谷 P2458 [SDOI2006] 保安站岗
  • 教你如何借助AI精读文献
  • MC0463四大名著-水浒签到
  • 在Vscode中使用Kimi K2模型:实践指南,三分钟生成个小游戏
  • 网络大提速,RDMA,IB,iWrap
  • 深度学习中的模型剪枝工具Torch-Pruning的使用
  • 如何解决AttributeError: ‘NoneType‘ object has no attribute问题
  • 使用 PlanetScope 卫星图像绘制水质参数:以莫干湖为例
  • 记录我coding印象比较深刻的BUG
  • 【Docker项目实战】使用Docker部署Homeland社区系统
  • 以太坊的心脏与大脑:详解执行客户端(EL)与共识客户端(CL)
  • 网络原理——TCP
  • node.js学习笔记1
  • 云边端协同架构下的智能计算革命