news 2026/5/7 23:42:56

行为型-中介者模式

作者头像

张小明

前端开发工程师

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/5/1 18:38:10

大模型Token缓存优化:利用TensorFlow-v2.9本地缓存机制

大模型Token缓存优化&#xff1a;利用TensorFlow-v2.9本地缓存机制 在大语言模型&#xff08;LLM&#xff09;逐步渗透到智能客服、代码生成和实时翻译等高交互场景的今天&#xff0c;一个看似微小却影响深远的问题正不断浮现——重复输入带来的冗余计算。尤其当用户反复提及相…

作者头像 李华
网站建设 2026/5/3 6:13:15

diskinfo监控TensorFlow检查点文件增长趋势

diskinfo监控TensorFlow检查点文件增长趋势 在深度学习模型训练日益常态化的今天&#xff0c;一个看似不起眼的问题却频繁打断研发节奏&#xff1a;磁盘空间突然耗尽&#xff0c;导致数天的训练任务功亏一篑。这种“意外”往往源于检查点&#xff08;Checkpoint&#xff09;文件…

作者头像 李华
网站建设 2026/5/3 21:22:08

为什么你的Python异步任务总是卡顿?揭秘Asyncio线程池与IO阻塞的4大真相

第一章&#xff1a;Python异步任务卡顿现象的根源剖析在高并发场景下&#xff0c;Python 的异步编程模型常被用于提升 I/O 密集型任务的执行效率。然而&#xff0c;开发者在实际使用中频繁遭遇“异步任务卡顿”问题——即协程长时间阻塞、事件循环停滞或响应延迟陡增。这种现象…

作者头像 李华
网站建设 2026/5/1 8:56:41

git push代码到GitHub时忽略大型模型文件技巧

git push代码到GitHub时忽略大型模型文件技巧 在深度学习项目开发中&#xff0c;你是否遇到过这样的尴尬&#xff1a;一次 git add . 之后&#xff0c;发现 Git 正在“努力”追踪一个 5GB 的 best_model.h5 文件&#xff1f;等了几分钟才弹出警告&#xff1a;“remote: error:…

作者头像 李华
网站建设 2026/5/3 5:23:22

Asyncio + Redis 实现分布式锁:5分钟解决任务重复执行的生产级方案

第一章&#xff1a;Asyncio Redis 实现分布式锁&#xff1a;5分钟解决任务重复执行的生产级方案在高并发的异步服务场景中&#xff0c;多个协程或服务实例可能同时触发同一任务&#xff0c;导致数据重复处理、资源争用等问题。使用 Asyncio 结合 Redis 可构建高性能、低延迟的…

作者头像 李华
网站建设 2026/5/3 7:00:42

Python数据缓存避坑指南(8个常见错误及性能修复策略)

第一章&#xff1a;Python数据缓存的核心价值与适用场景在现代应用开发中&#xff0c;性能优化是提升用户体验的关键环节。Python作为一门广泛应用于Web服务、数据分析和人工智能领域的语言&#xff0c;其对数据缓存机制的支持尤为重要。数据缓存通过将频繁访问或计算代价高的结…

作者头像 李华