2016-12-06 11 views
0

У меня есть - рабочий интерфейс. каждый рабочий имеет энергию. класс juniorWorker что реализует работник интерфейс -Decorator Pattern issue in JAVA

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

и. младший рабочий имеет 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; 
    } 
} 

На самом деле, я пытаюсь ИНТ работы() будет подсчитывать общую энергию каждый работник будет тратить. , например, мой Демо класс:

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() а не getEnergy() метода на закрытом объекте работника, состоявшемся в декораторе в рамках своего метода work().

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

Посмотрите на призыв иерархии.
efficientWork.work() звонки worker.getEnergy(), с PowerWork как worker. PowerWork.getEnergy() возвращает 1.1.

1,1 * 0,8 = 0,88, который затем приводится к междунар и становится 0.

+0

спасибо! отличный ответ. – MoZZ

1

В коде efficientworker.work() логически расширяется до

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

спасибо! понял теперь. – MoZZ

 Смежные вопросы

  • Нет связанных вопросов^_^