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

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.dtcms.com/a/288077.html

相关文章:

  • HOT100——排序篇Leetcode215. 数组中的第K个最大元素
  • 深度解析 rag-vector-agent-semantic-kernel:基于 Semantic Kernel 的 Agentic RAG 实践
  • 变频器实习Day10
  • JS原型相关知识
  • EINO框架解读:字节跳动开源的大模型应用开发框架
  • 【jquery详细讲解】
  • Vue Swiper组件
  • Vue组件化开发小案例
  • 在开发板tmp目录下传输文件很快的原因和注意事项:重启开发板会清空tmp文件夹,记得复制文件到其他地方命令如下(cp 文件所在路径 文件要复制到的路径—)
  • GitLab 社区版 10.8.4 安装、汉化与使用教程
  • GPU集群如何规划
  • 子串算法题
  • Web攻防-身份验证篇JWT令牌空密钥未签名密钥爆破JWKJWUKID算法替换CVE报告复盘
  • 在Vscode中使用Kimi K2模型:实践指南,三分钟生成个小游戏
  • TypeScript 中的「类」:从语法到实战的完整指南
  • 论C/C++的条件编译#if、#ifdef、#ifndef、#undef
  • Promise入门
  • 三级知识点汇总(详解)【c++】——2
  • 我用Cursor,1周上线了一个虚拟资料流量主小程序技术选型
  • Linux“一切皆文件“设计哲学 与 Linux文件抽象层:struct file与file_operations的架构解析
  • 【ChatOpenAI】常用方法详解
  • HOT100——动态规划篇Leetcode221. 最大正方形
  • C++ std::thread线程类 相关问题、函数总结
  • 单调队列深度解析(下)
  • 如何解决 ‘NoneType‘ object has no attribute ‘get‘问题
  • GA-BP遗传算法优化BP神经网络数据生成,采用SVM分类模型评估
  • LM317 芯片推荐电路中保护二极管工作原理
  • 教育科技内容平台的用户定位与产品方案:从需求到解决方案的精准匹配
  • prometheus UI 和node_exporter节点图形化Grafana
  • GaussDB 数据库架构师修炼(六) 集群工具管理-1