Java中介者案例

wen java案例 1

本文目录导读:

Java中介者案例

  1. 中介者接口
  2. 抽象同事类
  3. 具体同事类
  4. 具体中介者
  5. 测试类
  6. 运行结果
  7. 中介者模式的优势
  8. 实际应用场景

我将为您提供一个完整的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
---
=== 家庭成员离开场景 ===
🔒 门锁 [大门] 已上锁
门锁 [大门] 发送消息: 关门
📡 中介者转发消息: 关门 (发送者: 大门)
灯光 [客厅灯] 收到消息: 关门
💡 灯光 [客厅灯] 已关闭
灯光 [卧室灯] 收到消息: 关门
💡 灯光 [卧室灯] 已关闭
空调 [客厅空调] 收到消息: 关门
❄️ 空调 [客厅空调] 已关闭
---
=== 手动控制场景 ===
空调 [客厅空调] 发送消息: 打开
📡 中介者转发消息: 打开 (发送者: 客厅空调)
灯光 [客厅灯] 收到消息: 打开
💡 灯光 [客厅灯] 已打开
灯光 [卧室灯] 收到消息: 打开
💡 灯光 [卧室灯] 已打开
门锁 [大门] 收到消息: 打开
---
灯光 [卧室灯] 发送消息: 打开
📡 中介者转发消息: 打开 (发送者: 卧室灯)
灯光 [客厅灯] 收到消息: 打开
💡 灯光 [客厅灯] 已打开
空调 [客厅空调] 收到消息: 打开
❄️ 空调 [客厅空调] 已打开
门锁 [大门] 收到消息: 打开
---
灯光 [卧室灯] 发送消息: 关闭
📡 中介者转发消息: 关闭 (发送者: 卧室灯)
灯光 [客厅灯] 收到消息: 关闭
💡 灯光 [客厅灯] 已关闭
空调 [客厅空调] 收到消息: 关闭
❄️ 空调 [客厅空调] 已关闭
门锁 [大门] 收到消息: 关闭
---

中介者模式的优势

  1. 解耦:同事类之间不再直接相互引用,降低了耦合度
  2. 集中控制:交互逻辑集中在中介者中,便于维护
  3. 简化交互:将多对多的交互简化为一对多的交互
  4. 易于扩展:新增同事类时,只需实现同事接口即可

实际应用场景

  • 聊天室系统
  • 机场航空控制系统
  • 图形界面(MVC模式)
  • 分布式系统协调
  • 消息中间件系统

这个案例展示了中介者模式如何协调多个对象之间的交互,避免了对象之间的直接耦合,使得系统更容易维护和扩展。

抱歉,评论功能暂时关闭!