2016-12-06 6 views
0

i have - ワーカーインターフェイス 各作業員にエネルギーがあります。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クラスを。 efficientWorkはエネルギーを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型の仕事をしようとしています()は、各労働者が過ごすことになります総エネルギーを合計します。 例えば、私のデモクラス:

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

となっています。あなたのコードで

// 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()となり、PowerWorkworkerとなります。 PowerWork.getEnergy()は1.1を返します。

1.1 * 0.8 = 0.88、その後、int型にキャストし、あなたは、そのwork()メソッド内デコレータ内に保持された囲まれたワーカーオブジェクトにwork()ないgetEnergy()メソッドを呼び出すべきである0

+0

ありがとうございます!素晴らしい答え。 – MoZZ

1

efficientworker.work()論理的

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

ありがとう!今理解した。 – MoZZ