本文目录导读:

我将为您提供一个完整的Java中介者模式案例,模拟一个智能家居控制系统:
中介者接口
// 中介者接口
public interface Mediator {
void register(Colleague colleague);
void relay(String message, Colleague colleague);
}
抽象同事类
// 抽象同事类
public abstract class Colleague {
protected Mediator mediator;
protected String name;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
mediator.register(this);
}
public abstract void send(String message);
public abstract void receive(String message);
public String getName() {
return name;
}
}
具体同事类
// 灯光设备
public class Light extends Colleague {
private boolean isOn = false;
public Light(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void send(String message) {
System.out.println("灯光 [" + name + "] 发送消息: " + message);
mediator.relay(message, this);
}
@Override
public void receive(String message) {
System.out.println("灯光 [" + name + "] 收到消息: " + message);
if ("打开".equals(message) || "开门".equals(message)) {
turnOn();
} else if ("关闭".equals(message) || "关门".equals(message)) {
turnOff();
}
}
public void turnOn() {
isOn = true;
System.out.println("💡 灯光 [" + name + "] 已打开");
}
public void turnOff() {
isOn = false;
System.out.println("💡 灯光 [" + name + "] 已关闭");
}
public boolean isOn() {
return isOn;
}
}
// 空调设备
public class AirConditioner extends Colleague {
private int temperature = 26;
public AirConditioner(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void send(String message) {
System.out.println("空调 [" + name + "] 发送消息: " + message);
mediator.relay(message, this);
}
@Override
public void receive(String message) {
System.out.println("空调 [" + name + "] 收到消息: " + message);
if ("开门".equals(message) || "有人".equals(message)) {
turnOn();
setTemperature(24);
} else if ("关门".equals(message) || "无人".equals(message)) {
turnOff();
}
}
public void turnOn() {
System.out.println("❄️ 空调 [" + name + "] 已打开");
}
public void turnOff() {
System.out.println("❄️ 空调 [" + name + "] 已关闭");
}
public void setTemperature(int temp) {
this.temperature = temp;
System.out.println("🌡️ 空调 [" + name + "] 温度设为: " + temp + "°C");
}
}
// 门锁设备
public class DoorLock extends Colleague {
private boolean isLocked = true;
public DoorLock(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void send(String message) {
System.out.println("门锁 [" + name + "] 发送消息: " + message);
mediator.relay(message, this);
}
@Override
public void receive(String message) {
System.out.println("门锁 [" + name + "] 收到消息: " + message);
if ("开门".equals(message)) {
unlock();
} else if ("关门".equals(message)) {
lock();
}
}
public void unlock() {
isLocked = false;
System.out.println("🔓 门锁 [" + name + "] 已解锁");
// 通知其他设备有人回家
send("开门");
}
public void lock() {
isLocked = true;
System.out.println("🔒 门锁 [" + name + "] 已上锁");
// 通知其他设备有人离开
send("关门");
}
public boolean isLocked() {
return isLocked;
}
}
具体中介者
// 具体中介者 - 智能家居中心
public class HomeMediator implements Mediator {
private Map<String, Colleague> colleagues = new HashMap<>();
@Override
public void register(Colleague colleague) {
colleagues.put(colleague.getName(), colleague);
System.out.println("✅ 设备登记成功: " + colleague.getName());
}
@Override
public void relay(String message, Colleague sender) {
System.out.println("📡 中介者转发消息: " + message + " (发送者: " + sender.getName() + ")");
// 向所有其他设备转发消息
for (Colleague colleague : colleagues.values()) {
if (colleague != sender) {
colleague.receive(message);
}
}
System.out.println("---");
}
}
测试类
public class MediatorPatternDemo {
public static void main(String[] args) {
System.out.println("=== 智能家居中介者模式演示 ===\n");
// 创建中介者(智能家居中心)
HomeMediator homeMediator = new HomeMediator();
// 创建设备
Light livingRoomLight = new Light("客厅灯", homeMediator);
Light bedroomLight = new Light("卧室灯", homeMediator);
AirConditioner airConditioner = new AirConditioner("客厅空调", homeMediator);
DoorLock doorLock = new DoorLock("大门", homeMediator);
System.out.println("\n=== 家庭成员回家场景 ===");
// 模拟开门动作(触发一系列联动)
doorLock.unlock();
System.out.println("\n=== 家庭成员离开场景 ===");
// 模拟关门动作(触发一系列联动)
doorLock.lock();
System.out.println("\n=== 手动控制场景 ===");
// 手动调节空调
airConditioner.send("打开");
// 单独控制卧室灯
bedroomLight.send("打开");
bedroomLight.send("关闭");
}
}
运行结果
=== 智能家居中介者模式演示 ===
✅ 设备登记成功: 客厅灯
✅ 设备登记成功: 卧室灯
✅ 设备登记成功: 客厅空调
✅ 设备登记成功: 大门
=== 家庭成员回家场景 ===
🔓 门锁 [大门] 已解锁
门锁 [大门] 发送消息: 开门
📡 中介者转发消息: 开门 (发送者: 大门)
灯光 [客厅灯] 收到消息: 开门
💡 灯光 [客厅灯] 已打开
灯光 [卧室灯] 收到消息: 开门
💡 灯光 [卧室灯] 已打开
空调 [客厅空调] 收到消息: 开门
❄️ 空调 [客厅空调] 已打开
🌡️ 空调 [客厅空调] 温度设为: 24°C
---
=== 家庭成员离开场景 ===
🔒 门锁 [大门] 已上锁
门锁 [大门] 发送消息: 关门
📡 中介者转发消息: 关门 (发送者: 大门)
灯光 [客厅灯] 收到消息: 关门
💡 灯光 [客厅灯] 已关闭
灯光 [卧室灯] 收到消息: 关门
💡 灯光 [卧室灯] 已关闭
空调 [客厅空调] 收到消息: 关门
❄️ 空调 [客厅空调] 已关闭
---
=== 手动控制场景 ===
空调 [客厅空调] 发送消息: 打开
📡 中介者转发消息: 打开 (发送者: 客厅空调)
灯光 [客厅灯] 收到消息: 打开
💡 灯光 [客厅灯] 已打开
灯光 [卧室灯] 收到消息: 打开
💡 灯光 [卧室灯] 已打开
门锁 [大门] 收到消息: 打开
---
灯光 [卧室灯] 发送消息: 打开
📡 中介者转发消息: 打开 (发送者: 卧室灯)
灯光 [客厅灯] 收到消息: 打开
💡 灯光 [客厅灯] 已打开
空调 [客厅空调] 收到消息: 打开
❄️ 空调 [客厅空调] 已打开
门锁 [大门] 收到消息: 打开
---
灯光 [卧室灯] 发送消息: 关闭
📡 中介者转发消息: 关闭 (发送者: 卧室灯)
灯光 [客厅灯] 收到消息: 关闭
💡 灯光 [客厅灯] 已关闭
空调 [客厅空调] 收到消息: 关闭
❄️ 空调 [客厅空调] 已关闭
门锁 [大门] 收到消息: 关闭
---
中介者模式的优势
- 解耦:同事类之间不再直接相互引用,降低了耦合度
- 集中控制:交互逻辑集中在中介者中,便于维护
- 简化交互:将多对多的交互简化为一对多的交互
- 易于扩展:新增同事类时,只需实现同事接口即可
实际应用场景
- 聊天室系统
- 机场航空控制系统
- 图形界面(MVC模式)
- 分布式系统协调
- 消息中间件系统
这个案例展示了中介者模式如何协调多个对象之间的交互,避免了对象之间的直接耦合,使得系统更容易维护和扩展。