以下是一个简单清晰的中介者模式示例,以 智能家居控制系统 为例,通过中介者协调不同设备的开关逻辑:
假设有一个智能家居系统,包含:
设备间存在联动规则:
/**
* 智能家居中介者接口:定义设备交互方法
*/
public interface SmartHomeMediator {
void deviceChanged(Device device); // 当设备状态变化时触发协调
}
/**
* 具体中介者:实现设备联动逻辑
*/
public class ConcreteMediator implements SmartHomeMediator {
private Light light;
private AirConditioner ac;
private Speaker speaker;
// 注册设备到中介者
public void registerDevices(Light light, AirConditioner ac, Speaker speaker) {
this.light = light;
this.ac = ac;
this.speaker = speaker;
}
@Override
public void deviceChanged(Device device) {
// 根据触发设备类型执行联动逻辑
if (device instanceof Light) {
handleLightStateChange((Light) device);
} else if (device instanceof AirConditioner) {
handleACStateChange((AirConditioner) device);
}
}
// 灯光变化触发联动
private void handleLightStateChange(Light light) {
if (light.isOn()) {
System.out.println("检测到开灯 → 启动到家模式");
ac.turnOn(); // 自动开空调
speaker.turnOn(); // 自动开音响
} else {
System.out.println("检测到关灯 → 启动离家模式");
ac.turnOff(); // 自动关空调
speaker.turnOff(); // 自动关音响
}
}
// 空调变化触发联动(示例逻辑)
private void handleACStateChange(AirConditioner ac) {
if (ac.isOn()) {
System.out.println("空调已开启 → 调整灯光亮度");
light.setBrightness(50); // 调暗灯光
}
}
}
/**
* 设备基类:所有设备继承此类,持有中介者引用
*/
public abstract class Device {
protected SmartHomeMediator mediator;
public Device(SmartHomeMediator mediator) {
this.mediator = mediator;
}
// 设备状态变化时通知中介者
public abstract void statusChanged();
}
/**
* 具体设备:灯光
*/
public class Light extends Device {
private boolean isOn = false;
private int brightness = 100;
public Light(SmartHomeMediator mediator) {
super(mediator);
}
public void turnOn() {
isOn = true;
System.out.println("灯光已打开");
statusChanged();
}
public void turnOff() {
isOn = false;
System.out.println("灯光已关闭");
statusChanged();
}
public void setBrightness(int brightness) {
this.brightness = brightness;
System.out.println("灯光亮度调整为 " + brightness + "%");
}
public boolean isOn() {
return isOn;
}
@Override
public void statusChanged() {
mediator.deviceChanged(this); // 通知中介者状态变化
}
}
// 空调和音响类实现类似(代码省略)
public class Client {
public static void main(String[] args) {
// 1. 创建中介者
ConcreteMediator mediator = new ConcreteMediator();
// 2. 创建设备并注册到中介者
Light light = new Light(mediator);
AirConditioner ac = new AirConditioner(mediator);
Speaker speaker = new Speaker(mediator);
mediator.registerDevices(light, ac, speaker);
// 3. 模拟用户操作:开灯 → 触发联动
System.out.println("===== 测试到家模式 =====");
light.turnOn();
// 4. 模拟用户操作:关灯 → 触发联动
System.out.println("\n===== 测试离家模式 =====");
light.turnOff();
// 5. 模拟空调开启 → 触发调光
System.out.println("\n===== 测试空调联动 =====");
ac.turnOn();
}
}
===== 测试到家模式 =====
灯光已打开
检测到开灯 → 启动到家模式
空调已开启
音响已开启
===== 测试离家模式 =====
灯光已关闭
检测到关灯 → 启动离家模式
空调已关闭
音响已关闭
===== 测试空调联动 =====
空调已开启 → 调整灯光亮度
灯光亮度调整为 50%
Light
)不直接操作其他设备,只与中介者通信。
statusChanged()
通知中介者,中介者根据当前状态协调其他设备。
此示例通过家居场景直观展示了中介者模式的核心优势:将网状交互变为星型交互,提升系统可维护性。