文章目录
- [中介者模式(Mediator Pattern)](#中介者模式(Mediator Pattern))
- 核心原理
- [Java 实践示例](#Java 实践示例)
- 代码解析
- 运行结果
- 应用场景
- 中介者模式的优势
中介者模式(Mediator Pattern)
中介者模式是 23 种设计模式中的一种行为型模式,它的核心思想是通过引入一个中介者对象,封装一系列对象之间的交互关系,使得对象之间无需直接通信,而是通过中介者间接交互,从而降低对象之间的耦合度。
核心原理
- 中介者(Mediator):
定义一个接口,用于与各同事对象通信
协调各个同事对象之间的交互关系 - 具体中介者(ConcreteMediator):
实现中介者接口,持有所有同事对象的引用
具体实现协调同事对象交互的逻辑 - 同事类(Colleague):
每个同事对象都知道中介者对象
当需要与其他同事通信时,通过中介者进行
当自身状态改变时,通知中介者
中介者模式的核心是 "封装交互",将多对多的复杂关系转化为一对多的简单关系,符合迪米特原则(最少知识原则)。
Java 实践示例
下面以 "聊天室" 为例实现中介者模式:
聊天室(中介者)负责转发用户(同事)发送的消息
用户之间不直接通信,而是通过聊天室间接交流
java
package com.example.demo;
import java.util.List;
import java.util.ArrayList;
public class MediatorPattern {
public static void main(String[] args) {
// 创建中介者(聊天室)
ChatRoom chatRoom = new ChatRoom();
// 创建同事(用户)
User user1 = new User("张三", chatRoom);
User user2 = new User("李四", chatRoom);
User user3 = new User("王五", chatRoom);
// 注册用户到聊天室
chatRoom.registerUser(user1);
chatRoom.registerUser(user2);
chatRoom.registerUser(user3);
// 发送消息
user1.send("大家好!");
System.out.println("---");
user2.send("张三你好!");
System.out.println("---");
user3.send("我是王五,很高兴认识大家!");
}
// 同事类(用户)
public static class User {
private String name;
private Mediator mediator; // 持有中介者引用
public User(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public String getName() {
return name;
}
// 发送消息(通过中介者)
public void send(String message) {
System.out.println(name + "发送消息: " + message);
mediator.sendMessage(message, this);
}
// 接收消息
public void receive(String message, String senderName) {
System.out.println(name + "收到来自" + senderName + "的消息: " + message);
}
}
// 中介者接口
public interface Mediator {
// 转发消息
void sendMessage(String message, User sender);
// 注册用户
void registerUser(User user);
}
public static class ChatRoom implements Mediator {
private List<User> users;
public ChatRoom() {
this.users = new ArrayList<>();
}
@Override
public void registerUser(User user) {
users.add(user);
}
@Override
public void sendMessage(String message, User sender) {
// 遍历所有用户,除了发送者本人,转发消息
for (User user : users) {
if (user != sender) {
user.receive(message, sender.getName());
}
}
}
}
}
代码解析
Mediator 接口:定义了中介者的基本行为,包括转发消息和注册用户
ChatRoom 类:具体中介者实现
持有所有用户的引用
实现消息转发逻辑:将消息发送给除发送者之外的所有用户
提供用户注册功能
User 类:同事类
每个用户都持有中介者(聊天室)的引用
发送消息时通过中介者进行,不直接与其他用户交互
提供接收消息的方法
运行结果
bash
张三发送消息: 大家好!
李四收到来自张三的消息: 大家好!
王五收到来自张三的消息: 大家好!
---
李四发送消息: 张三你好!
张三收到来自李四的消息: 张三你好!
王五收到来自李四的消息: 张三你好!
---
王五发送消息: 我是王五,很高兴认识大家!
张三收到来自王五的消息: 我是王五,很高兴认识大家!
李四收到来自王五的消息: 我是王五,很高兴认识大家!
应用场景
模块间交互复杂的系统:如电商平台的订单、库存、支付等模块之间的交互
GUI 组件交互:如窗口中的按钮、文本框、列表等组件通过一个中介者协调交互
消息中间件:如 MQ(消息队列)本质上是一种中介者,解耦消息生产者和消费者
分布式系统协调:如 ZooKeeper 作为分布式协调服务,扮演中介者角色
团队协作系统:如项目管理工具中,任务、成员、里程碑等通过系统中介协调
中介者模式的优势
在于减少对象间的直接依赖,使得系统更易于维护和扩展;
缺点是如果设计不当,中介者可能会变得过于复杂,成为 "上帝对象"。因此在使用时需注意控制中介者的职责范围。