2012-05-01 5 views
2

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

質問:使用上の人物インタフェース以下に定義人口のクラスを実装するためのDecoratorパターンを考えると

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(); 
+1

「人口」は人の集合なので、それはBMIの計算機ではなく、そうでなければなりません。私は母集団の中でBMI特有の機能を最初からやっていることをちょっと心配しています。 –

+0

@Daveは、BMI特有の機能が人口クラスに含まれるべきではないことに完全に同意しています。 –

+0

私はJavaの先生でしたので、デザインパターンを使用する単純な、おもちゃのドメイン割り当てを作成することの難しさを理解しています。 DPは単に過度に単純化されたものには適していません。 –

答えて

1

私は人を飾るためにデコレータパターンを使用しません。

class BMICalculator { 
    double getBMI(Person person) {} 
} 

は、その後、私は人口のクラス

class Population { 
    private final BMICalculator calc; 
    public double getAverageBMI() { 
     double total = 0; 
     for (Person p : people) { 
      total += calc.getBMI(p); 
     } 
     return total/people.size(); 
    } 
} 

私はデコレータがここに収まるとは思わないでBMICalculatorを使用します。私のようなものに見えるBMIを計算するための別のクラスを作成します。

+0

これは「戦略」と呼ばれるでしょう。 –

+0

ここに戦略パターンはありません。これは単なるオブジェクト指向プログラミングであり、別のオブジェクトを使ってそれが行うように設計されています。 –

+0

もしそれが戦略でなければ、再びそれがオブジェクトであっても正当化はほとんどありません。なぜ単純な静的な方法ではないのですか?オブジェクトを持つポイントは、動的ディスパッチです。この場合、プラグイン可能な別の実装を提供します。 –

0

アイデアは、インターフェイスを定義することです。 BmiPerson extends Person { double bmi(); }を入力し、Populationに集約します。したがって、BmiPersonPersonまで拡張されていても、内部に別のPersonを含むように実装することはできます。つまり、デコレータです。少なくともそれが私が作ることのできる最高のものです。 PopulationPersonを受け入れ、BmiPersonの余分な方法については知りませんので、まだそれほど意味をなさない。

+0

BmiPersonを定義するのは愚かではありませんか? –

+0

はい、そうです:)コメントを書いたときに私は答えを更新しました。 –

+1

しかし、 'Population'クラスは、その情報にアクセスするために必要な' Population' BMIメソッドを仮定して、 'BmiPerson'しか収集できません。 –

0

この質問は(少なくとも)2つの理由からゴミです。

1.インターフェイスにデコレータパターンを適用することはできません。このパターンの目標は、 の基本機能に新しい動作を追加することです。インタフェースには基本機能がありません。

2.パターンのもう1つの点は、新しい の機能をオブジェクト単位で適用できることです。あなたは計算したくないBMIを持つ Personを決して持っていません。

関連する問題