JAVA中的装饰模式问题

时间:2016-12-06 22:25:00

标签: java int double decorator

我有 - 工人界面。 每个工人都有精力充沛。

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

还有 - effectiveWork,实现工人接口的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 work()将总计每个工作人员将花费的总能量。 例如,我的演示类:

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)

3 个答案:

答案 0 :(得分:1)

看看heirarchy的电话 efficientWork.work()调用worker.getEnergy()PowerWorkworkerPowerWork.getEnergy()返回1.1。

1.1 * 0.8 = 0.88,然后转换为int并变为0。

答案 1 :(得分:1)

您应该在其work()方法中的装饰器中保存的封闭工作对象上调用getEnergy()而不是work()方法。

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

答案 2 :(得分:1)

在您的代码中,efficientworker.work()在逻辑上扩展为

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