簡體   English   中英

JAVA中的裝飾器模式問題

[英]Decorator Pattern issue in JAVA

我有-Worker 界面 每個工人都有能量。

public interface Worker {
    int work();
    double getEnergy();
}

和-juniorWorker類,用於實現 Worker 接口 初級工人有100能量。

public class juniorWorker implements Worker {
    public int work() {
        return (int) getEnergy();
    }
    public double getEnergy() {
        return 100;
    }
}

以及具有有效的Work,powerWork類,該類實現了 Worker 接口 高效工作將減少20%的能源。 powerWork將使能源增加10%。

public class efficientWork implements Worker {
    private Worker worker;
    public efficientWork(Worker w) {
        this.worker=w;
}
    public int work() {
        return (int) (worker.getEnergy()*getEnergy());
    }
    public double getEnergy() {
        return 0.8;
    }
}
public class PowerWork implements Worker {
    private Worker worker;
    public PowerWork(Worker w) {
        this.worker=w;
}
    public int work() {
        return  (int) (worker.getEnergy()*getEnergy());
    }
    public double getEnergy() {
        return 1.1;
    }
}

實際上,我正在嘗試int work()總結每個工人將花費的總能量 例如,我的Demo類:

public class Demo {
    public static void main(String[] args) {
        Worker j= new efficientWork(new juniorWorker());
        System.out.println(j.work());
    }
}

這種情況正在工作 -系統將打印80

但是在此示例中,始終打印0:

public class Demo {
    public static void main(String[] args) {
        Worker j= new efficientWork(new PowerWork(new juniorWorker()));
        System.out.println(j.work());
    }
}

救命 ? 我期望得到88! (110 * 0.8)

看一下呼叫層次結構。
efficientWork.work()調用worker.getEnergy() ,將PowerWork用作worker PowerWork.getEnergy()返回1.1。

1.1 * 0.8 = 0.88,然后將其強制轉換為int並變為0。

您應該在修飾器的work()方法內保存的封閉工作對象上調用work()而不是getEnergy() work()方法。

// decorator's work method
public int work() {
    // return (int) (worker.getEnergy() * getEnergy()); // NO!
    return (int) (worker.work() * getEnergy());    // YES!
}

在您的代碼中, efficientworker.work()邏輯上擴展為

(int)(efficientWork.getEnergy() * PowerWork.getEnergy()) 
= (int)(0.8 * 1.1) 
= (int)(0.88)
= 0

暫無
暫無

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

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