当前位置: 首页 > 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.lryc.cn/news/593544.html

相关文章:

  • 【办公类-107-02】20250719视频MP4转gif(削减MB)
  • Triton的核心概念与简单入门
  • 突破研究边界!探索OpenAI o3与o4-mini模型的无限可能
  • Attu-Milvus向量数据库可视化工具
  • 《Linux系统配置实战:NTP时间同步与SSH免密登录全流程指南》​​
  • Linux练习二
  • 低代码平台ToolJet实战总结
  • 网络大提速,RDMA,IB,iWrap
  • windows docker-03-如何一步步学习 docker
  • 游戏开发日志
  • SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView
  • eNSP综合实验(DNCP、NAT、TELET、HTTP、DNS)
  • 西门子 S7-1500 PLC 电源选型指南:系统电源与负载电源的核心区别
  • 【Linux服务器】-zabbix通过proxy进行分级监控
  • 【初识数据结构】CS61B中的基本图算法:DFS, BFS, Dijkstra, A* 算法及其来历用法
  • JavaSE-接口
  • 枚举类高级用法
  • 嵌入式学习-PyTorch(8)-day24
  • Ubuntu20.04 samba配置
  • 读书笔记:最好使用C++转型操作符
  • UE5制作小地图
  • CSS篇——第二章 六十五项关键技能(下篇)
  • Django3 - Web前端开发基础 HTML、CSS和JavaScript
  • 【C语言进阶】题目练习(3)
  • 【RK3576】【Android14】摄像头MIPI开发调试
  • Android Auto 即将推出新功能
  • 7月19日日记
  • NJU 凸优化导论(9) 对偶(II)KKT条件+变形重构
  • react+antd+表格拖拽排序以及上移、下移、移到顶部、移到底部
  • Git仓库使用