[英]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.