簡體   English   中英

使用組合時如何從組合的 class 到達主 class?

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

我正在使用類的組合。 主要的 class 包含 2 個其他類。 我的問題是如何從組合類中訪問我的主要 class ? 可能有哪些方法?

例如。 我們有機器 class,里面有 2 個設備。 所有 3 個類都有一個 boolean state 是否處於活動狀態。 我們可以打開設備。 任務是:當兩個設備都打開時,機器 state 處於活動狀態。 可以使用哪些方法來實現這種行為?

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);

    }
}

兩個設備都打開后,機器活動 state 應該是true 如何做到這一點?

最簡單的解決方案是這樣做:

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

您可能會考慮的一件事是為您的設備使用抽象類或讓您的設備擴展機器。 然后可以有一個機器列表並獨立檢查每台活躍的機器 state。

如果我理解你的問題,機器內部的方法應該是這樣的。

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

您必須檢查所有定義的設備是否已打開。 應該清楚的是,每個設備都應該有一個state,它描述了關閉關閉打開后是否處於活動狀態。

其中一種方法可能是在機器 class 中沒有 isActive boolean state 並且只有 isActive 方法,如下所示:

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

以下將是一個更好的設計。 此設計假設一台機器可以有一個或多個設備,並且每個設備都將引用該機器。

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM