news 2026/4/27 6:46:58

行为型-中介者模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
行为型-中介者模式

1. 项目结构

  1. 项目结构
mediator-pattern-demo/ ├── src/ │ └── main/ │ └── java/ │ └── com/ │ └── example/ │ └── mediator/ │ ├── Mediator.java │ ├── ChatMediator.java │ ├── User.java │ ├── ChatUser.java │ └── Main.java ├── pom.xml └── README.md
  1. Maven配置文件 (pom.xml)

    <?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>mediator-pattern-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 如果需要测试,可以添加JUnit依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies></project>

2. 代码实现

  1. 中介者接口 (Mediator.java)

    packagecom.example.mediator;/** * 中介者接口 * 定义同事对象与中介者交互的方法 */publicinterfaceMediator{/** * 发送消息 * @param message 消息内容 * @param user 发送者 */voidsendMessage(Stringmessage,Useruser);/** * 添加用户 * @param user 要添加的用户 */voidaddUser(Useruser);/** * 移除用户 * @param user 要移除的用户 */voidremoveUser(Useruser);}
  2. 具体中介者 - 聊天室 (ChatMediator.java)

    packagecom.example.mediator;importjava.util.ArrayList;importjava.util.List;/** * 具体中介者 - 聊天室 * 实现中介者接口,协调用户之间的通信 */publicclassChatMediatorimplementsMediator{privateList<User>users;privateStringchatRoomName;publicChatMediator(StringchatRoomName){this.users=newArrayList<>();this.chatRoomName=chatRoomName;System.out.println("聊天室 '"+chatRoomName+"' 已创建");}@OverridepublicvoidsendMessage(Stringmessage,Usersender){System.out.println("\n"+sender.getName()+" 在聊天室 '"+chatRoomName+"' 发送消息: "+message);// 向所有其他用户转发消息for(Useruser:users){// 不向发送者自己发送消息if(user!=sender){user.receive(message,sender);}}// 记录系统消息System.out.println("消息已广播给 "+(users.size()-1)+" 个用户");}@OverridepublicvoidaddUser(Useruser){users.add(user);user.setMediator(this);System.out.println(user.getName()+" 加入了聊天室 '"+chatRoomName+"'");}@OverridepublicvoidremoveUser(Useruser){users.remove(user);System.out.println(user.getName()+" 离开了聊天室 '"+chatRoomName+"'");}/** * 获取聊天室中的用户数量 */publicintgetUserCount(){returnusers.size();}/** * 获取聊天室名称 */publicStringgetChatRoomName(){returnchatRoomName;}}
  3. 同事类接口 (User.java)

    packagecom.example.mediator;/** * 同事类接口 * 定义用户与中介者交互的方法 */publicabstractclassUser{protectedMediatormediator;protectedStringname;publicUser(Stringname){this.name=name;}/** * 发送消息 * @param message 消息内容 */publicabstractvoidsend(Stringmessage);/** * 接收消息 * @param message 消息内容 * @param sender 发送者 */publicabstractvoidreceive(Stringmessage,Usersender);/** * 设置中介者 * @param mediator 中介者对象 */publicvoidsetMediator(Mediatormediator){this.mediator=mediator;}/** * 获取用户名称 */publicStringgetName(){returnname;}}
  4. 具体同事类 - 聊天用户 (ChatUser.java)

    packagecom.example.mediator;/** * 具体同事类 - 聊天用户 */publicclassChatUserextendsUser{privatebooleanisOnline;publicChatUser(Stringname){super(name);this.isOnline=true;}@Overridepublicvoidsend(Stringmessage){if(isOnline){System.out.println("\n"+name+" 正在发送消息...");mediator.sendMessage(message,this);}else{System.out.println(name+" 当前离线,无法发送消息");}}@Overridepublicvoidreceive(Stringmessage,Usersender){if(isOnline){System.out.println(name+" 收到来自 "+sender.getName()+" 的消息: "+message);}else{// 离线消息处理逻辑System.out.println(name+" 离线,消息已存储");}}/** * 设置在线状态 * @param online 是否在线 */publicvoidsetOnline(booleanonline){this.isOnline=online;Stringstatus=online?"上线":"离线";System.out.println(name+" 已"+status);}/** * 获取在线状态 */publicbooleanisOnline(){returnisOnline;}}
  5. 主程序 (Main.java)

    packagecom.example.mediator;/** * 主程序 - 演示中介者模式 */publicclassMain{publicstaticvoidmain(String[]args){System.out.println("======= 中介者模式演示 - 聊天室应用 =======");// 创建中介者 - 聊天室ChatMediatorchatRoom=newChatMediator("设计模式讨论组");// 创建用户Useralice=newChatUser("Alice");Userbob=newChatUser("Bob");Usercharlie=newChatUser("Charlie");Userdiana=newChatUser("Diana");// 将用户加入聊天室chatRoom.addUser(alice);chatRoom.addUser(bob);chatRoom.addUser(charlie);chatRoom.addUser(diana);System.out.println("\n======= 开始聊天 =======");// 用户发送消息alice.send("大家好!今天我们来讨论中介者模式。");bob.send("中介者模式可以减少对象之间的直接耦合,对吧?");// 设置用户离线((ChatUser)charlie).setOnline(false);// 继续发送消息diana.send("是的,它通过引入中介对象来协调对象间的交互。");// 离线用户发送消息charlie.send("这个模式在GUI开发中很常用。");// 用户重新上线((ChatUser)charlie).setOnline(true);bob.send("Charlie,你回来了!");charlie.send("是的,我刚刚离线了一会儿。");// 移除用户chatRoom.removeUser(diana);// 剩余用户继续聊天alice.send("Diana离开了,我们继续讨论。");System.out.println("\n======= 聊天结束 =======");System.out.println("聊天室 '"+chatRoom.getChatRoomName()+"' 中还有 "+chatRoom.getUserCount()+" 个用户");// 演示中介者模式的另一个例子 - 飞机交通控制System.out.println("\n\n======= 中介者模式另一个例子 - 飞机交通控制 =======");// 创建航空交通控制中心Mediatoratc=newAirTrafficControl();// 创建飞机Userflight101=newFlight("Flight-101",atc);Userflight202=newFlight("Flight-202",atc);Userflight303=newFlight("Flight-303",atc);// 飞机发送状态flight101.send("正在请求降落许可");flight202.send("正在爬升到10000英尺");flight303.send("报告当前位置:纬度40.7,经度-74.0");}/** * 另一个中介者实现 - 航空交通控制 */staticclassAirTrafficControlimplementsMediator{@OverridepublicvoidsendMessage(Stringmessage,Useruser){System.out.println("【航空交通控制中心】收到来自 "+user.getName()+" 的消息: "+message);System.out.println("【航空交通控制中心】正在处理请求...");}@OverridepublicvoidaddUser(Useruser){System.out.println("【航空交通控制中心】"+user.getName()+" 已注册");}@OverridepublicvoidremoveUser(Useruser){System.out.println("【航空交通控制中心】"+user.getName()+" 已注销");}}/** * 另一个同事类实现 - 飞机 */staticclassFlightextendsUser{publicFlight(Stringname,Mediatormediator){super(name);this.mediator=mediator;mediator.addUser(this);}@Overridepublicvoidsend(Stringmessage){System.out.println(name+" 发送: "+message);mediator.sendMessage(message,this);}@Overridepublicvoidreceive(Stringmessage,Usersender){System.out.println(name+" 收到来自控制中心的指令: "+message);}}}

3. 构建和运行

  1. 构建项目

    mvn clean compile
  2. 运行程序

    mvn exec:java-Dexec.mainClass="com.example.mediator.Main"

4. 核心概念

项目解释:

  • Mediator(中介者接口):定义同事对象与中介者交互的接口

  • ConcreteMediator(具体中介者):实现中介者接口,协调各同事对象的行为

  • Colleague(同事类):定义同事类的接口,每个同事对象都知道中介者对象

  • ConcreteColleague(具体同事类):实现同事类接口,与其他同事对象通过中介者通信

模式优点:

  • 减少耦合:将对象间多对多的关联转变为一对多的关联,降低了对象之间的耦合度

  • 集中控制:将交互逻辑集中在中介者中,使得交互更容易理解和维护

  • 可扩展性:新增同事类时只需要与中介者交互,不需要修改其他同事类

适用场景:

  • 当对象之间存在复杂的引用关系时

  • 当需要创建一个运行于多个类之间的公共行为,又不想生成太多子类时

  • GUI应用程序中多个组件之间的交互

  • 聊天应用程序

  • 航空交通控制系统

  • 事件分发系统

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 18:35:18

GitHub Star暴涨秘诀:发布基于TensorFlow-v2.9的开源模板

GitHub Star暴涨秘诀&#xff1a;发布基于TensorFlow-v2.9的开源模板 在AI项目开发中&#xff0c;你是否经历过这样的场景&#xff1f;团队成员刚拿到代码&#xff0c;第一句话却是&#xff1a;“这个依赖装不上”、“CUDA版本不兼容”、“为什么在我机器上跑不通&#xff1f;…

作者头像 李华
网站建设 2026/4/25 2:00:25

GitHub Project管理TensorFlow功能迭代路线图

GitHub Project 与 TensorFlow 开发生态&#xff1a;从路线图到可运行环境的无缝闭环 在深度学习技术高速迭代的今天&#xff0c;一个框架能否持续引领创新&#xff0c;不仅取决于其算法能力&#xff0c;更在于背后工程体系的成熟度。TensorFlow 作为工业级 AI 框架的代表&…

作者头像 李华
网站建设 2026/4/25 2:00:07

AI原生驱动,网络“自驱”前行:HPE Networking开启自动驾驶网络新纪元

当前&#xff0c;人工智能技术正在重塑全球产业格局&#xff0c;网络作为数字世界的“神经网络”也面临着前所未有的挑战与机遇。连接设备的指数级增长、混合云环境的复杂异构、AI工作负载对性能的极致要求&#xff0c;以及日益严峻的安全威胁&#xff0c;都在推动网络从传统自…

作者头像 李华
网站建设 2026/4/22 23:39:38

git branch管理多个AI实验分支:TensorFlow项目协作规范

Git 分支与 TensorFlow 镜像协同&#xff1a;构建可复现的 AI 实验协作体系 在深度学习项目中&#xff0c;一个常见的困境是&#xff1a;昨天还跑得通的实验&#xff0c;今天却因为某次“小改动”而彻底失效&#xff1b;或者团队成员之间反复争论“你用的是哪个版本的代码&…

作者头像 李华
网站建设 2026/4/25 16:43:04

conda create虚拟环境:为不同项目隔离TensorFlow依赖

构建可复现的深度学习环境&#xff1a;conda create 与 TensorFlow 镜像的协同实践 在深度学习项目日益复杂的今天&#xff0c;一个常见的困扰是&#xff1a;“为什么我的代码在同事机器上跑不通&#xff1f;” 更具体一点——明明安装了 TensorFlow&#xff0c;却因为版本不兼…

作者头像 李华
网站建设 2026/4/25 15:53:40

Jupyter Notebook卡顿怎么办?TensorFlow-v2.9性能调优建议

Jupyter Notebook卡顿怎么办&#xff1f;TensorFlow-v2.9性能调优建议 在深度学习项目开发中&#xff0c;你是否经历过这样的场景&#xff1a;训练一个简单的 CNN 模型时&#xff0c;Jupyter Notebook 突然“卡住”&#xff0c;进度条不动、输出无响应&#xff0c;刷新页面后内…

作者头像 李华