本文目录导读:

我将为您提供一个完整的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模式)
- 分布式系统协调
- 消息中间件系统
这个案例展示了中介者模式如何协调多个对象之间的交互,避免了对象之间的直接耦合,使得系统更容易维护和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播