首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是装饰者设计模式的一个很好的实例吗?

这是装饰者设计模式的一个很好的实例吗?
EN

Stack Overflow用户
提问于 2012-05-02 05:01:15
回答 3查看 249关注 0票数 2

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

问题:

代码语言:javascript
复制
interface Person(){
    double getWeightInKG();
    double getHeightInMeters();
}

给定上面的person接口,使用装饰器模式来实现下面定义的Population类。BMI使用公式BMI = weight(Kg) /height(M)^2来计算。您可能需要设计和实现其他类和接口来实现这一点。假设您已经使用了java.util.ArrayList。

代码语言:javascript
复制
+ 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(); 
EN

回答 3

Stack Overflow用户

发布于 2012-05-02 05:09:10

我不会用装饰图案来装饰这个人。我将创建一个单独的类来计算BMI,如下所示:

代码语言:javascript
复制
class BMICalculator {
    double getBMI(Person person) {}
}

然后我将在Population类中使用BMICalculator

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-05-02 05:09:21

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

票数 0
EN

Stack Overflow用户

发布于 2015-01-01 14:13:03

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10404292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档