1. 项目结构
- 项目结构
mediator-pattern-demo/ ├── src/ │ └── main/ │ └── java/ │ └── com/ │ └── example/ │ └── mediator/ │ ├── Mediator.java │ ├── ChatMediator.java │ ├── User.java │ ├── ChatUser.java │ └── Main.java ├── pom.xml └── README.mdMaven配置文件 (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. 代码实现
中介者接口 (Mediator.java)
packagecom.example.mediator;/** * 中介者接口 * 定义同事对象与中介者交互的方法 */publicinterfaceMediator{/** * 发送消息 * @param message 消息内容 * @param user 发送者 */voidsendMessage(Stringmessage,Useruser);/** * 添加用户 * @param user 要添加的用户 */voidaddUser(Useruser);/** * 移除用户 * @param user 要移除的用户 */voidremoveUser(Useruser);}具体中介者 - 聊天室 (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;}}同事类接口 (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;}}具体同事类 - 聊天用户 (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;}}主程序 (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. 构建和运行
构建项目
mvn clean compile运行程序
mvn exec:java-Dexec.mainClass="com.example.mediator.Main"
4. 核心概念
项目解释:
Mediator(中介者接口):定义同事对象与中介者交互的接口
ConcreteMediator(具体中介者):实现中介者接口,协调各同事对象的行为
Colleague(同事类):定义同事类的接口,每个同事对象都知道中介者对象
ConcreteColleague(具体同事类):实现同事类接口,与其他同事对象通过中介者通信
模式优点:
减少耦合:将对象间多对多的关联转变为一对多的关联,降低了对象之间的耦合度
集中控制:将交互逻辑集中在中介者中,使得交互更容易理解和维护
可扩展性:新增同事类时只需要与中介者交互,不需要修改其他同事类
适用场景:
当对象之间存在复杂的引用关系时
当需要创建一个运行于多个类之间的公共行为,又不想生成太多子类时
GUI应用程序中多个组件之间的交互
聊天应用程序
航空交通控制系统
事件分发系统