news 2026/2/14 18:25:07

行为型-中介者模式

作者头像

张小明

前端开发工程师

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/2/14 6:50:13

大模型Token top-k采样:改进TensorFlow生成质量

大模型Token Top-k采样&#xff1a;改进TensorFlow生成质量 在当前大模型驱动的自然语言处理浪潮中&#xff0c;一个看似微小的技术选择——如何从模型输出中挑选下一个token&#xff0c;往往决定了生成文本是“惊艳”还是“胡言乱语”。尽管现代Transformer架构已经能够捕捉复…

作者头像 李华
网站建设 2026/2/9 1:01:45

【稀缺资源】资深架构师私藏的Python日志可视化方案首次公开

第一章&#xff1a;Python日志可视化的核心价值与架构思维在现代软件系统中&#xff0c;日志不仅是故障排查的依据&#xff0c;更是系统行为分析的重要数据源。Python日志可视化通过将分散、非结构化的日志信息转化为可交互、可追溯的图形化展示&#xff0c;显著提升了运维效率…

作者头像 李华
网站建设 2026/2/6 20:03:43

GitHub Issue跟踪AI项目Bug:结合TensorFlow日志反馈

GitHub Issue跟踪AI项目Bug&#xff1a;结合TensorFlow日志反馈 在现代AI项目的开发过程中&#xff0c;一个看似微小的训练中断或性能下降问题&#xff0c;往往可能耗费团队数小时甚至数天的时间去排查。尤其是在分布式训练、多成员协作的场景下&#xff0c;“在我机器上能跑”…

作者头像 李华
网站建设 2026/2/9 18:58:57

如何用Python异步IO提升数据库吞吐量?这4个模式必须掌握

第一章&#xff1a;Python异步IO与数据库操作的性能革命在现代高并发Web应用中&#xff0c;传统的同步I/O模型常因阻塞式数据库调用导致资源浪费与响应延迟。Python的异步IO&#xff08;asyncio&#xff09;结合异步数据库驱动&#xff0c;为这一瓶颈提供了高效解决方案&#x…

作者头像 李华
网站建设 2026/2/12 19:26:55

别再复制粘贴了!掌握这7个技巧,用Python自动化编辑JSON数据

第一章&#xff1a;Python 结构化数据 JSON 编辑器开发 在现代应用开发中&#xff0c;JSON 作为一种轻量级的数据交换格式&#xff0c;被广泛用于配置文件、API 数据传输和前后端通信。使用 Python 开发一个结构化 JSON 编辑器&#xff0c;不仅能提升数据处理效率&#xff0c;还…

作者头像 李华