2016-12-06 48 views
0

我有 - 工作人員界面。每個工人都有能量。裝飾模式問題在JAVA

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

和 - juniorWorker類實現工人接口。初中職員有100能量。

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

,也有 - 那實現工人接口 efficientWork,powerWork類。高效工作將減少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工作()將總結總能源每個工人將花費。 例如,我的Demo類:

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

這種情況下可以正常工作 - 系統將打印。

但是這個例子中,打印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)

+0

你爲什麼要傳遞一個工人對象,以實現工人的所有類? – Joey

+0

我期待得到88! (110 * 0.8) – MoZZ

+0

@HovercraftFullOfEels只是解釋了一些。 – MoZZ

回答

1

你應該調用其work()方法內裝飾內保持的封閉工對象上的work()不是getEnergy()方法。

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

看看電話heirarchy。
efficientWork.work()來電worker.getEnergy()PowerWork作爲workerPowerWork.getEnergy()返回1.1。

1.1 * 0.8 = 0.88,然後將其轉換爲int和變爲0

+0

謝謝!!很好的答案。 – MoZZ

1

在你的代碼,efficientworker.work()邏輯擴展到

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

謝謝!現在明白了。 – MoZZ