1. 项目结构
- 项目结构
bash
mediator-pattern-demo/
├── src/
│ └── main/
│ └── java/
│ └── com/
│ └── example/
│ └── mediator/
│ ├── Mediator.java
│ ├── ChatMediator.java
│ ├── User.java
│ ├── ChatUser.java
│ └── Main.java
├── pom.xml
└── README.md
-
Maven配置文件 (pom.xml)
xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="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)
javapackage com.example.mediator; /** * 中介者接口 * 定义同事对象与中介者交互的方法 */ public interface Mediator { /** * 发送消息 * @param message 消息内容 * @param user 发送者 */ void sendMessage(String message, User user); /** * 添加用户 * @param user 要添加的用户 */ void addUser(User user); /** * 移除用户 * @param user 要移除的用户 */ void removeUser(User user); } -
具体中介者 - 聊天室 (ChatMediator.java)
javapackage com.example.mediator; import java.util.ArrayList; import java.util.List; /** * 具体中介者 - 聊天室 * 实现中介者接口,协调用户之间的通信 */ public class ChatMediator implements Mediator { private List<User> users; private String chatRoomName; public ChatMediator(String chatRoomName) { this.users = new ArrayList<>(); this.chatRoomName = chatRoomName; System.out.println("聊天室 '" + chatRoomName + "' 已创建"); } @Override public void sendMessage(String message, User sender) { System.out.println("\n" + sender.getName() + " 在聊天室 '" + chatRoomName + "' 发送消息: " + message); // 向所有其他用户转发消息 for (User user : users) { // 不向发送者自己发送消息 if (user != sender) { user.receive(message, sender); } } // 记录系统消息 System.out.println("消息已广播给 " + (users.size() - 1) + " 个用户"); } @Override public void addUser(User user) { users.add(user); user.setMediator(this); System.out.println(user.getName() + " 加入了聊天室 '" + chatRoomName + "'"); } @Override public void removeUser(User user) { users.remove(user); System.out.println(user.getName() + " 离开了聊天室 '" + chatRoomName + "'"); } /** * 获取聊天室中的用户数量 */ public int getUserCount() { return users.size(); } /** * 获取聊天室名称 */ public String getChatRoomName() { return chatRoomName; } } -
同事类接口 (User.java)
javapackage com.example.mediator; /** * 同事类接口 * 定义用户与中介者交互的方法 */ public abstract class User { protected Mediator mediator; protected String name; public User(String name) { this.name = name; } /** * 发送消息 * @param message 消息内容 */ public abstract void send(String message); /** * 接收消息 * @param message 消息内容 * @param sender 发送者 */ public abstract void receive(String message, User sender); /** * 设置中介者 * @param mediator 中介者对象 */ public void setMediator(Mediator mediator) { this.mediator = mediator; } /** * 获取用户名称 */ public String getName() { return name; } } -
具体同事类 - 聊天用户 (ChatUser.java)
javapackage com.example.mediator; /** * 具体同事类 - 聊天用户 */ public class ChatUser extends User { private boolean isOnline; public ChatUser(String name) { super(name); this.isOnline = true; } @Override public void send(String message) { if (isOnline) { System.out.println("\n" + name + " 正在发送消息..."); mediator.sendMessage(message, this); } else { System.out.println(name + " 当前离线,无法发送消息"); } } @Override public void receive(String message, User sender) { if (isOnline) { System.out.println(name + " 收到来自 " + sender.getName() + " 的消息: " + message); } else { // 离线消息处理逻辑 System.out.println(name + " 离线,消息已存储"); } } /** * 设置在线状态 * @param online 是否在线 */ public void setOnline(boolean online) { this.isOnline = online; String status = online ? "上线" : "离线"; System.out.println(name + " 已" + status); } /** * 获取在线状态 */ public boolean isOnline() { return isOnline; } } -
主程序 (Main.java)
javapackage com.example.mediator; /** * 主程序 - 演示中介者模式 */ public class Main { public static void main(String[] args) { System.out.println("======= 中介者模式演示 - 聊天室应用 ======="); // 创建中介者 - 聊天室 ChatMediator chatRoom = new ChatMediator("设计模式讨论组"); // 创建用户 User alice = new ChatUser("Alice"); User bob = new ChatUser("Bob"); User charlie = new ChatUser("Charlie"); User diana = new ChatUser("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======= 中介者模式另一个例子 - 飞机交通控制 ======="); // 创建航空交通控制中心 Mediator atc = new AirTrafficControl(); // 创建飞机 User flight101 = new Flight("Flight-101", atc); User flight202 = new Flight("Flight-202", atc); User flight303 = new Flight("Flight-303", atc); // 飞机发送状态 flight101.send("正在请求降落许可"); flight202.send("正在爬升到10000英尺"); flight303.send("报告当前位置:纬度40.7,经度-74.0"); } /** * 另一个中介者实现 - 航空交通控制 */ static class AirTrafficControl implements Mediator { @Override public void sendMessage(String message, User user) { System.out.println("【航空交通控制中心】收到来自 " + user.getName() + " 的消息: " + message); System.out.println("【航空交通控制中心】正在处理请求..."); } @Override public void addUser(User user) { System.out.println("【航空交通控制中心】" + user.getName() + " 已注册"); } @Override public void removeUser(User user) { System.out.println("【航空交通控制中心】" + user.getName() + " 已注销"); } } /** * 另一个同事类实现 - 飞机 */ static class Flight extends User { public Flight(String name, Mediator mediator) { super(name); this.mediator = mediator; mediator.addUser(this); } @Override public void send(String message) { System.out.println(name + " 发送: " + message); mediator.sendMessage(message, this); } @Override public void receive(String message, User sender) { System.out.println(name + " 收到来自控制中心的指令: " + message); } } }
3. 构建和运行
-
构建项目
bashmvn clean compile -
运行程序
bashmvn exec:java -Dexec.mainClass="com.example.mediator.Main"
4. 核心概念
项目解释:
-
Mediator(中介者接口):定义同事对象与中介者交互的接口
-
ConcreteMediator(具体中介者):实现中介者接口,协调各同事对象的行为
-
Colleague(同事类):定义同事类的接口,每个同事对象都知道中介者对象
-
ConcreteColleague(具体同事类):实现同事类接口,与其他同事对象通过中介者通信
模式优点:
-
减少耦合:将对象间多对多的关联转变为一对多的关联,降低了对象之间的耦合度
-
集中控制:将交互逻辑集中在中介者中,使得交互更容易理解和维护
-
可扩展性:新增同事类时只需要与中介者交互,不需要修改其他同事类
适用场景:
-
当对象之间存在复杂的引用关系时
-
当需要创建一个运行于多个类之间的公共行为,又不想生成太多子类时
-
GUI应用程序中多个组件之间的交互
-
聊天应用程序
-
航空交通控制系统
-
事件分发系统