使用合成时如何从合成的到达主要class?

How to reach main class from composed ones when using composition?

我正在使用 classes 的组合。主 class 包含另外 2 个 class。我的问题是如何从组合的 classes 到达我的主要 class?可能有哪些方法?

例如。我们有机器 class,里面有 2 个设备。所有 3 classes 都有一个布尔状态是否激活。我们可以打开设备。任务是:当两个设备都打开时,THEN 机器状态处于活动状态。 可以使用什么方法来实现这种行为?

public class Machine {

    private boolean active;

    private Device1 device1;
    private Device2 device2;

    public Machine(Device1 device1, Device2 device2) {
        this.device1 = device1;
        this.device2 = device2;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    public Device1 getDevice1() {
        return device1;
    }

    public Device2 getDevice2() {
        return device2;
    }

}

public class Device1 {

    private boolean active;

    public void turnOn(){
        // should check the state of another device and change machine state if necessary
        this.active = true;
    }

}

public class Device2 {

    private boolean active;

    public void turnOn(){
        this.active = true;
        // should check the state of another device and change machine state if necessary
    }

}

public class App {
    public static void main(String[] args) {

        Device1 device1 = new Device1();
        Device2 device2 = new Device2();

        Machine machine = new Machine(device1, device2);

        machine.getDevice1().turnOn();
        machine.getDevice2().turnOn();

        boolean active = machine.isActive();  // should be true
        System.out.println(active);

    }
}

打开两个设备后,机器活动状态应为 true。如何实现?

如果我理解你的问题,机器内部的方法应该是这样的。

public boolean isActive() {
        this.active = device1.isActive() && device2.isActive()
        return this.active;
 }

您必须检查是否所有定义的设备都已打开。需要明确的是,每个设备都应该有一个状态,描述在关闭关闭打开后是否处于活动状态。

最简单的解决方案是这样做:

public boolean isActive() {
    if (device1 == null || device2 == null) return false;
    return device1.isActive() && device2.isActive();
}

您可能会考虑为您的设备使用 Abstract 类 或让您的设备扩展机器。然后可以有一个机器列表并独立检查每台机器的活动状态。

一种方法可能是在 Machine class 中没有 isActive 布尔状态,而只有如下所示的 isActive 方法:

public boolean isActive(){
    return device1.isActive() && device2.isActive();
}