Java行为型模式---中介者模式
中介者模式基础概念
中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而降低耦合度,并可以独立地改变它们之间的交互。中介者模式将多对多的交互转化为一对多的交互,集中控制对象间的通信。
中介者模式的核心组件
- 抽象中介者(Mediator) - 定义中介者与同事对象之间的通信接口。
- 具体中介者(ConcreteMediator) - 实现抽象中介者接口,协调各同事对象之间的交互,持有所有同事对象的引用。
- 抽象同事类(Colleague) - 定义同事类的公共接口,每个同事对象都知道其中介者对象,并通过中介者进行通信。
- 具体同事类(ConcreteColleague) - 实现抽象同事类,只知道中介者而不知道其他同事对象,通过中介者与其他同事通信。
中介者模式的实现
下面通过一个简单的聊天室示例展示中介者模式的实现:
// 1. 抽象中介者
interface ChatMediator {void sendMessage(String message, User user);void addUser(User user);
}// 2. 具体中介者 - 聊天室
class ChatRoom implements ChatMediator {private List<User> users = new ArrayList<>();@Overridepublic void sendMessage(String message, User user) {// 中介者负责消息的转发for (User u : users) {if (u != user) { // 不发送给自己u.receiveMessage(message);}}}@Overridepublic void addUser(User user) {users.add(user);}
}// 3. 抽象同事类 - 用户
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receiveMessage(String message);
}// 4. 具体同事类 - 普通用户
class NormalUser extends User {public NormalUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(name + " 发送消息: " + message);mediator.sendMessage(message, this); // 通过中介者发送消息}@Overridepublic void receiveMessage(String message) {System.out.println(name + " 收到消息: " + message);}
}// 5. 具体同事类 - VIP用户
class VIPUser extends User {public VIPUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println("[VIP] " + name + " 发送消息: " + message);mediator.sendMessage("[VIP] " + message, this); // VIP消息添加特殊标识}@Overridepublic void receiveMessage(String message) {System.out.println(name + " 收到消息: " + message);}
}// 6. 客户端代码
public class MediatorPatternClient {public static void main(String[] args) {// 创建中介者ChatMediator chatRoom = new ChatRoom();// 创建同事对象User user1 = new NormalUser(chatRoom, "张三");User user2 = new NormalUser(chatRoom, "李四");User user3 = new VIPUser(chatRoom, "王五");// 将同事添加到中介者chatRoom.addUser(user1);chatRoom.addUser(user2);chatRoom.addUser(user3);// 发送消息user1.send("大家好!");System.out.println();user3.send("欢迎加入聊天室!");}
}
中介者模式的应用场景
- 系统中对象间依赖复杂 - 当对象间存在大量的相互引用和交互,导致依赖关系混乱时
- 集中控制交互 - 需要集中控制多个对象间的交互逻辑时
- MVC 架构 - 控制器(Controller)作为视图(View)和模型(Model)的中介
- GUI 组件交互 - 如窗口中多个组件间的联动
- 消息队列系统 - 消息中间件作为生产者和消费者的中介
- 多人游戏 - 游戏服务器作为玩家之间的中介,处理消息转发
中介者模式的优缺点
优点:
- 降低耦合度 - 对象间无需显式引用,减少了对象间的依赖关系
- 集中控制交互 - 将交互逻辑集中在中介者中,便于维护和修改
- 符合开闭原则 - 可以在不修改现有同事类的情况下,通过扩展中介者类来新增交互方式
- 简化对象协议 - 将多对多的交互转化为一对多的交互,简化了通信协议
- 便于复用 - 单个同事类可以在不同的中介者环境中复用
缺点:
- 中介者类膨胀 - 中介者承担了过多的交互逻辑,可能变得复杂庞大
- 维护难度增加 - 中介者类的修改可能影响多个同事类,增加维护风险
- 系统响应变慢 - 所有交互都通过中介者,可能导致系统响应性能下降
- 违反单一职责原则 - 中介者类可能负责过多的功能,导致职责不清晰
- 调试困难 - 中介者中的交互逻辑可能复杂,导致调试困难
使用中介者模式的注意事项
- 控制中介者复杂度 - 避免中介者类过于庞大,可将部分逻辑分解为更小的组件
- 合理设计中介者接口 - 确保中介者接口清晰,不包含无关功能
- 避免过度使用 - 仅在对象间交互复杂且需要集中控制时使用中介者模式
- 与观察者模式结合 - 中介者模式可以与观察者模式结合,实现事件驱动的交互
- 考虑性能影响 - 对于高性能要求的系统,需谨慎使用中介者模式
- 测试中介者 - 由于中介者集中了大量逻辑,应对其进行充分测试
总结
中介者模式通过引入一个中介对象来封装对象间的交互,将多对多的依赖关系转化为一对多的关系,从而降低系统的耦合度,提高可维护性和可扩展性。它在需要集中控制对象交互的场景中尤为有用,如 GUI 系统、消息队列、多人游戏等。合理使用中介者模式可以使系统结构更加清晰,但需注意控制中介者类的复杂度,避免其成为系统的瓶颈。