这是Decorator设计模式的一个很好的例子吗?

时间:2012-05-01 21:01:15

标签: java design-patterns decorator

所以我今天参加了计算机科学课程的介绍。其中一个问题是装饰设计模式,它给我带来了一些麻烦。我的问题不是关于正确的答案是什么,而是这甚至是一个使用装饰器模式的好例子。为什么要设置人员层次结构同样容易,并且需要更少的类来让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(); 

3 个答案:

答案 0 :(得分: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();
     } 
}

我认为装饰师不适合这里。

答案 1 :(得分:0)

这个想法是定义一个接口,例如BmiPerson extends Person { double bmi(); }然后将其汇总到Population。因此即使BmiPerson扩展Person,它仍然可以实现,以便在其中包含另一个Person - 装饰器。至少那是我能做到的最好的。由于Population接受Person并且不知道BmiPerson中的额外方法,因此它仍然没有多大意义。

答案 2 :(得分:0)

这个问题很垃圾,至少有两个原因。

1。您无法将Decorator模式应用于界面。该     模式的目标是将新行为强加于某个基础     功能。接口没有基本功能。

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