设计模式:中介者模式代码案例

发布于:2024-04-20 ⋅ 阅读:(24) ⋅ 点赞:(0)

示例1

一个智能家居控制系统。在这个系统中,我们有多个设备,如灯光、窗帘、空调等,它们之间需要相互协作以达到智能控制的目的。例如,当我们说“晚安”时,系统需要关闭灯光、拉上窗帘、调整空调到适宜的温度。在这个场景中,中介者(智能家居控制中心)就是协调各个设备之间交互的核心。

示例代码

首先,我们定义设备的接口和几个具体的设备类:

interface SmartDevice {
    void operateDevice(String command, Mediator mediator);
}

class Light implements SmartDevice {
    @Override
    public void operateDevice(String command, Mediator mediator) {
        System.out.println("Light " + command);
        mediator.notifyDevices(this, command);
    }
}

class Curtain implements SmartDevice {
    @Override
    public void operateDevice(String command, Mediator mediator) {
        System.out.println("Curtain " + command);
        mediator.notifyDevices(this, command);
    }
}

class AirConditioner implements SmartDevice {
    @Override
    public void operateDevice(String command, Mediator mediator) {
        System.out.println("AirConditioner " + command);
        mediator.notifyDevices(this, command);
    }
}

接下来,我们定义中介者接口和具体的中介者实现:

interface Mediator {
    void addDevice(SmartDevice device);
    void notifyDevices(String command);
}

class SmartHomeMediator implements Mediator {
    private List<SmartDevice> devices = new ArrayList<>();

    @Override
    public void addDevice(SmartDevice device) {
        devices.add(device);
    }

    @Override
    public void notifyDevices(String command) {
        for (SmartDevice device : devices) {
            device.operateDevice(command, this);
        }
    }
}

最后,我们通过客户端代码来演示智能家居系统的工作流程:

public class SmartHomeDemo {
    public static void main(String[] args) {
        Mediator mediator = new SmartHomeMediator();
        
        SmartDevice light = new Light();
        SmartDevice curtain = new Curtain();
        SmartDevice airConditioner = new AirConditioner();
        
        mediator.addDevice(light);
        mediator.addDevice(curtain);
        mediator.addDevice(airConditioner);
        
        // 通过中介者统一控制,模拟“晚安”场景
        System.out.println("Activating Goodnight Scene:");
        mediator.notifyDevices("OFF");
    }
}

示例2

在这个例子中,SmartHomeMediator是中介者,它知道如何协调各个智能设备之间的交互。当我们对灯光说“晚安”(即关闭灯光)时,中介者可以根据预设的场景,通知窗帘拉上、空调调节到适宜的温度等,从而达到智能控制的效果。

中介者模式可以类比为日常生活中的航空交通管制中心(ATC)。在一个繁忙的机场,有许多飞机需要起飞、降落、滑行和等待,如果每架飞机直接与其他飞机沟通,情况会变得异常复杂且危险。航空交通管制中心作为中介者,协调所有飞机的动作,确保安全和有效的运营。

示例代码

首先,我们定义飞机的接口和具体的飞机类:

interface Aircraft {
    void send(String message);
    void receive(String message);
}

class Airplane implements Aircraft {
    private AirTrafficControlMediator atcMediator;
    private String flightNumber;

    public Airplane(AirTrafficControlMediator atc, String flightNumber) {
        this.atcMediator = atc;
        this.flightNumber = flightNumber;
    }

    @Override
    public void send(String message) {
        System.out.println("Flight " + flightNumber + " sending message: " + message);
        atcMediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("Flight " + flightNumber + " received message: " + message);
    }
}

接下来,我们定义中介者接口和具体的中介者实现:

interface AirTrafficControlMediator {
    void sendMessage(String message, Aircraft aircraft);
    void addAircraft(Aircraft aircraft);
}

class AirTrafficControlCenter implements AirTrafficControlMediator {
    private List<Aircraft> aircrafts = new ArrayList<>();

    @Override
    public void addAircraft(Aircraft aircraft) {
        aircrafts.add(aircraft);
    }

    @Override
    public void sendMessage(String message, Aircraft originAircraft) {
        for (Aircraft aircraft : aircrafts) {
            // 飞机不接收自己发送的消息
            if (aircraft != originAircraft) {
                aircraft.receive(message);
            }
        }
    }
}

最后,我们通过客户端代码来演示航空交通管制中心的工作流程:

public class AirTrafficControlDemo {
    public static void main(String[] args) {
        AirTrafficControlMediator atcMediator = new AirTrafficControlCenter();

        Aircraft flight1 = new Airplane(atcMediator, "AC159");
        Aircraft flight2 = new Airplane(atcMediator, "DL120");
        Aircraft flight3 = new Airplane(atcMediator, "UA993");

        atcMediator.addAircraft(flight1);
        atcMediator.addAircraft(flight2);
        atcMediator.addAircraft(flight3);

        // 模拟飞机间的通信
        flight1.send("Ascending to 30,000 ft.");
        flight2.send("Descending to 10,000 ft.");
        flight3.send("Requesting permission to land.");
    }
}

在这个例子中,AirTrafficControlCenter是中介者,它知道如何协调各个飞机之间的交流。每架飞机通过航空交通管制中心来发送和接收消息,而不是直接与其他飞机通信,这样减少了飞机之间的直接依赖,提高了系统的安全性和效率。


网站公告

今日签到

点亮在社区的每一天
去签到