所以我今天在计算机科学入门课上参加了一次考试。其中一个问题是关于装饰器设计模式的,它给我带来了一些麻烦。我的问题不是关于正确答案是什么,而是这是不是一个使用装饰器模式的好实例。为什么要装饰person层次结构,因为让Population类直接计算person BMI同样简单,并且只需要更少的类?由于BMI是Person对象状态的派生属性,装饰器真的会在这种情况下添加功能吗?
问题:
interface Person(){
double getWeightInKG();
double getHeightInMeters();
}给定上面的person接口,使用装饰器模式来实现下面定义的Population类。BMI使用公式BMI = weight(Kg) /height(M)^2来计算。您可能需要设计和实现其他类和接口来实现这一点。假设您已经使用了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(); 发布于 2012-05-02 05:09:10
我不会用装饰图案来装饰这个人。我将创建一个单独的类来计算BMI,如下所示:
class BMICalculator {
double getBMI(Person person) {}
}然后我将在Population类中使用BMICalculator
class Population {
private final BMICalculator calc;
public double getAverageBMI() {
double total = 0;
for ( Person p : people ) {
total += calc.getBMI(p);
}
return total/people.size();
}
}我不认为装饰者适合这里。
发布于 2012-05-02 05:09:21
其思想是定义一个接口,例如BmiPerson extends Person { double bmi(); },然后在Population中聚合这些接口。因此,即使BmiPerson扩展了Person,它仍然可以实现为在其中包含另一个Person --装饰器。至少这是我能做的最好的事情了。这仍然没有多大意义,因为Population接受Person,并且不知道BmiPerson中的额外方法。
发布于 2015-01-01 14:13:03
这个问题是垃圾,(至少)有两个原因。
1.您不能将装饰器模式应用于接口。该模式的目标是将新行为添加到一些基本功能上。接口没有基本功能。
2.该模式的另一点是,您可以逐个对象地应用新功能。你永远不会有一个你不想计算其体重指数的Person。
https://stackoverflow.com/questions/10404292
复制相似问题