簡體   English   中英

這是Decorator設計模式的好例子嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM