Как достичь основного класса из составных при использовании композиции? - PullRequest
0 голосов
/ 25 октября 2019

Я использую композицию классов. Основной класс содержит 2 других класса. У меня вопрос, как я могу достичь своего основного класса из составных классов? Какие могут быть пути?

Например. У нас есть класс Machine с двумя устройствами. Все 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 . Как этого добиться?

Ответы [ 4 ]

2 голосов
/ 25 октября 2019

Самое простое решение было бы сделать что-то вроде этого:

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

Одна вещь, которую вы могли бы рассмотреть, это использовать классы Abstract для ваших устройств или заставить ваши устройства расширять машину. Затем можно получить список машин и проверить активное состояние каждой машины независимо.

1 голос
/ 25 октября 2019

Если я понимаю ваш вопрос, метод внутри машины должен быть таким:

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

Вы должны проверить, все ли определенные устройства включены или нет. Должно быть понятно, что каждое устройство должно иметь состояние, которое описывает, является ли оно активным или нет после выключения и включения.

0 голосов
/ 25 октября 2019

Следующее будет лучшим дизайном. Эта конструкция предполагает, что машина может иметь одно или несколько устройств, и каждое из устройств будет иметь ссылку на машину.

public class Machine {

    private boolean active;
    public isActive(){      
        return this.active;
    }

    public setActiveIfAllDevicesAreTurnedOn(){
        for(Device device: deviceList)
            if(!device.isActive())
                return;
        this.active=true;
    } 

    private List<Device> deviceList=New ArrayList<Device>();
    //public getter and setter of deviceList
    ...
 }

public class Device {
    Machine machine;
    //public getter and setter of machine
    ...

    private boolean active;
    public void turnOn(){
        // should check the state of other devices and change machine state if necessary
        this.active = true;
        this.machine.setActiveIfAllDevicesAreTurnedOn();
    }
    public boolean isActive(){
        return this.active;
    }
 }

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

        Device device1 = new Device();
        Device device2 = new Device();        

        Machine machine = new Machine();
        machine.getDeviceList().add(device1);
        machine.getDeviceList().add(device2);

        device1.setMachine(machine);
        device2.setMachine(machine);

        machine.get(0).turnOn();
        machine.get(1).turnOn();

        boolean active = machine.isActive();  // should be true
        System.out.println(active);
    }
}
0 голосов
/ 25 октября 2019

Одним из способов может быть отсутствие логического состояния isActive в классе Machine и использование только метода isActive, как показано ниже:

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