[英]Is this a good instance for the Decorator design pattern?
因此,我今天在計算機科學入門課程中參加了考試。 問題之一是關於裝飾器的設計模式,這給我帶來了麻煩。 我的問題不是關於正確答案是什么,而是這是否完全可以使用裝飾器模式。 為什么要裝飾人的層次結構既簡單又需要較少的類,以使“人口”類直接計算人的BMI呢? 在這種情況下,由於BMI是Person對象狀態的派生屬性,裝飾器是否真的會添加功能?
題:
interface Person(){
double getWeightInKG();
double getHeightInMeters();
}
給定上面的人員接口,請使用裝飾器模式實現下面定義的種群類。 BMI使用公式BMI =體重(Kg)/身高(米)^ 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();
我不會使用裝飾器模式來裝飾人。 我將創建一個單獨的類來計算BMI,如下所示:
class BMICalculator {
double getBMI(Person person) {}
}
然后我將在人口類中使用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();
}
}
我認為裝飾器不適合這里。
這個想法是定義一個接口,例如BmiPerson extends Person { double bmi(); }
BmiPerson extends Person { double bmi(); }
然后在聚合這些Population
。 因此,即使BmiPerson
擴展了Person
,它仍然可以實現以在其中包含另一個Person
—裝飾器。 至少那是我能做到的最好的。 因為Population
接受Person
並且不知道BmiPerson
的額外方法,這仍然沒有多大意義。
這個問題是垃圾,至少有兩個原因。
1.您不能將裝飾圖案應用於界面。 該模式的目標是將新行為附加到一些基本功能上。 接口沒有基本功能。
2.模式的另一點是,您可以逐個對象地應用新功能。 您永遠不會有一個您不想計算其BMI的Person
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.