2

それで、私は今日、コンピュータサイエンスコースの紹介で試験を受けました。質問の1つは、デコレータのデザインパターンに関するもので、問題が発生しました。私の質問は、正解が何であるかではなく、これがデコレータパターンを使用するための良い例でさえあるかどうかです。Populationクラスで個人のBMIを直接計算するのと同じくらい簡単で、必要なクラスが少ないのに、なぜ個人の階層を装飾するのでしょうか。BMIはPersonオブジェクト状態の派生プロパティであるため、この場合、デコレータは実際に機能を追加しますか?

質問:

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

上記の人物インターフェースを前提として、デコレータパターンを使用して、以下に定義されているPopulationクラスを実装します。BMIは、式BMI = weight(Kg)/ height(meters)^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受け入れて知らないので、まだあまり意味がありません。PersonBmiPerson

于 2012-05-01T21:09:20.957 に答える