2

所以我今天参加了计算机科学入门课程的考试。其中一个问题是关于装饰器设计模式的,它给我带来了一些麻烦。我的问题不是关于正确答案是什么,而是这是否是一个使用装饰器模式的好例子。为什么要装饰人员层次结构,因为它同样容易并且需要更少的类来让 Population 类直接计算人员的 BMI?既然 BMI 是 Person 对象状态的派生属性,那么装饰器是否真的会在这种情况下添加功能?

问题:

interface Person(){
    double getWeightInKG();
    double getHeightInMeters();
}

鉴于上面的人员接口,使用装饰器模式来实现下面定义的 Population 类。BMI 的计算公式为 BMI = 体重(公斤)/身高(米)^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(); 
4

3 回答 3

1

我不会使用装饰器模式来装饰人。我会创建一个单独的类来计算看起来像这样的 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-01T21:09:09.780 回答
0

这个想法是定义一个接口,例如BmiPerson extends Person { double bmi(); } ,然后在Population. 所以即使BmiPersonextends Person,它仍然可以被实现以便在其中包含另一个Person- 装饰器。至少这是我能做到的最好的。它仍然没有多大意义,因为Population接受Person并且不知道BmiPerson.

于 2012-05-01T21:09:20.957 回答
0

这个问题是垃圾,(至少)有两个原因。

1.不能将装饰器模式应用于接口。该模式的目标是将新行为绑定到某些基本功能上。接口没有基本功能。

2.该模式的另一点是您可以逐个对象应用新功能。你永远不会有一个 Person你不想计算的BMI。

于 2015-01-01T06:13:03.470 回答