首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23种设计模式之中介者模式----一个简单清晰的中介者模式示例

23种设计模式之中介者模式----一个简单清晰的中介者模式示例

作者头像
紫风
发布2025-10-14 15:17:38
发布2025-10-14 15:17:38
100
代码可运行
举报
运行总次数:0
代码可运行

以下是一个简单清晰的中介者模式示例,以 智能家居控制系统 为例,通过中介者协调不同设备的开关逻辑:


场景描述

假设有一个智能家居系统,包含:

  • 灯光(Light)
  • 空调(AirConditioner)
  • 音响(Speaker)

设备间存在联动规则:

  1. 到家模式:开灯 → 自动开空调 → 开音响
  2. 离家模式:关灯 → 自动关空调 → 关音响
  3. 观影模式:关灯 → 关空调 → 开音响

代码实现
1. 中介者接口
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 智能家居中介者接口:定义设备交互方法
 */
public interface SmartHomeMediator {
    void deviceChanged(Device device);  // 当设备状态变化时触发协调
}
2. 具体中介者(协调设备联动)
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 具体中介者:实现设备联动逻辑
 */
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); // 调暗灯光
        }
    }
}

3. 设备基类(同事类)
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 设备基类:所有设备继承此类,持有中介者引用
 */
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); // 通知中介者状态变化
    }
}

// 空调和音响类实现类似(代码省略)

4. 客户端调用
代码语言:javascript
代码运行次数:0
运行
复制
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();
    }
}

输出结果
代码语言:javascript
代码运行次数:0
运行
复制
===== 测试到家模式 =====
灯光已打开
检测到开灯 → 启动到家模式
空调已开启
音响已开启

===== 测试离家模式 =====
灯光已关闭
检测到关灯 → 启动离家模式
空调已关闭
音响已关闭

===== 测试空调联动 =====
空调已开启 → 调整灯光亮度
灯光亮度调整为 50%

核心逻辑注释
  1. 解耦设备间依赖
    • 设备(如 Light)不直接操作其他设备,只与中介者通信。
    • 联动逻辑集中在中介者中,修改时无需改动设备类。
  2. 动态响应状态变化
    • 设备调用 statusChanged() 通知中介者,中介者根据当前状态协调其他设备。
  3. 扩展性
    • 新增设备(如加湿器)只需修改中介者联动逻辑,不影响现有设备。

适用场景总结
  • 多对象复杂联动:设备间存在多种交互规则。
  • 集中管理行为:如智能家居模式(睡眠模式/会客模式)。
  • 减少对象引用:避免设备间直接调用,降低耦合度。

此示例通过家居场景直观展示了中介者模式的核心优势:将网状交互变为星型交互,提升系统可维护性

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景描述
  • 代码实现
    • 1. 中介者接口
    • 2. 具体中介者(协调设备联动)
    • 3. 设备基类(同事类)
    • 4. 客户端调用
  • 输出结果
  • 核心逻辑注释
  • 适用场景总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档