所以我今天参加了计算机科学课程的介绍。其中一个问题是装饰设计模式,它给我带来了一些麻烦。我的问题不是关于正确的答案是什么,而是这甚至是一个使用装饰器模式的好例子。为什么要设置人员层次结构同样容易,并且需要更少的类来让Population类直接计算人员BMI?在这种情况下装饰器是否真的会添加功能,因为BMI是Person对象状态的派生属性?
问题:
interface Person(){
double getWeightInKG();
double getHeightInMeters();
}
鉴于上面的person接口,使用装饰器模式来实现下面定义的Population类。使用公式BMI =体重(Kg)/身高(米)^ 2计算BMI。您可能必须设计并实现其他类和接口才能实现此目的。假设您使用了java.util.ArrayList。
+ Population:
- public void addPerson(Person p);
- public void removePerson(Person p);
- public double getAverageBMI();
- public Person[ ] getPeopleInBMIRange(double bmi_min, bmi_max);
- public int populationSize();
答案 0 :(得分:1)
我不会使用装饰器模式来装饰这个人。我会创建一个单独的类来计算看起来像这样的BMI:
class BMICalculator {
double getBMI(Person person) {}
}
然后我会在Population类
中使用BMICalculatorclass Population {
private final BMICalculator calc;
public double getAverageBMI() {
double total = 0;
for ( Person p : people ) {
total += calc.getBMI(p);
}
return total/people.size();
}
}
我认为装饰师不适合这里。
答案 1 :(得分:0)
这个想法是定义一个接口,例如BmiPerson extends Person { double bmi(); }
然后将其汇总到Population
。因此即使BmiPerson
扩展Person
,它仍然可以实现,以便在其中包含另一个Person
- 装饰器。至少那是我能做到的最好的。由于Population
接受Person
并且不知道BmiPerson
中的额外方法,因此它仍然没有多大意义。
答案 2 :(得分:0)
这个问题很垃圾,至少有两个原因。
1。您无法将Decorator模式应用于界面。该 模式的目标是将新行为强加于某个基础 功能。接口没有基本功能。
2. 该模式的另一点是您可以应用新的
逐个对象的功能。你永远不会有
Person
您的BMI,您不想计算。