【问题标题】:How to reach main class from composed ones when using composition?使用组合时如何从组合类到达主类?
【发布时间】:2019-10-25 14:53:13
【问题描述】:

我正在使用类的组合。主类包含 2 个其他类。我的问题是如何从组合课程中进入我的主要课程?可能有哪些方法?

例如。我们有包含 2 个设备的机器类。所有 3 个类都有一个布尔状态是否处于活动状态。我们可以打开设备。任务是:当两个设备都打开时,机器状态处于活动状态。 可以使用哪些方法来实现这种行为?

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。如何做到这一点?

【问题讨论】:

    标签: java inheritance composition


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 非常感谢。如此简单而优雅的解决方案! :)
      • @KirillCh 使用此解决方案,您实际上并不需要实例成员active,您只需调用此方法(然后可以缩短为return device1.isActive() && device2.isActive())
      • @JoakimDanielson 在这种特殊情况下,您是绝对正确的。但是,如果我们将有一个额外的逻辑,那么机器状态可能是必要的
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-06
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多