2009-06-01 3 views
0

各製品には、ディスカウント、マーチャントによる割引、マーチャントによるボーナス、月間割引などの関連コスト計算機能があります。将来は、より多くのコスト計算が追加されます。コストデコレータ

具体的な製品クラスと、各コスト計算のための多くのデコレータがあります。すべての商品は、計算機が商品の販売者ID、カテゴリID、色などの商品のプロパティで計算を行うため、すべての計算機を使用する必要があります。

さらに、Googleのシステムには数百万の製品が必要です計算される。したがって、装飾された電卓をよりよくキャッシュします。なぜなら、実行時に各製品エンティティを飾るのは高価なためです。しかし、これはデコレータパターンでは難しいです。私たちの状況でこのパターンを使用するのは匂いのようです。

あなたはどう思いますか?デコレータ、戦略、責任連鎖のパターンを使用すべきでしょうか?またはパターンなし。

答えて

0

電卓 があなたの場合は商品等 商人のID、カテゴリID、色

よう 製品の性質によって、その計算を適用することを決定したため、すべての製品は、 電卓のすべてを使用する必要がありますすべての製品にすべてのデコレータを使用させる必要がある場合、パターンから実際に利益を得ることはできません。つまり、新しいデコレータを実装すると、その新しいデコレータを使用するためにすべての既存のエンティティを更新する必要がありますか?

デコレータは、必要なときにのみ製品に適用し、必要なデコレータだけを適用する必要があります。

デコレータ内から決定を削除する必要があると思います。デコレータを適用するかどうかを決定する必要があります。その場合、適切なデコレータに製品がラップされます。この方法で、製品がデコレータでラップされている場合、そのデコレータが製品に影響を与えていることがわかります。

+0

デコレータは製品のプロパティに基づいて計算を行い、製品のリストをループしてこれらの計算をすべての製品に適用します。したがって、各繰り返しでこれらの製品をそれぞれ装飾することで、計算ロジックのキャッシュが良いアイデアだと考えました。しかし、これはデコレータを使うのは難しいです。だから、よりよいアプローチは、戦略パターンをセット/ゲット・プロダクトとして使用することです。 プロダクトp = new Product(); p.setCalculationStrategy(listOfCalculators); p.price(); //すべての計算機を呼び出し、関心のある計算機だけが計算する –

+0

p.price(){ return listOfCalculators.price(); } listOfCalculators.price(){ それぞれ算出{ // ...}行う 戻り価格を、 } –

3

戦略パターンでは、オブジェクトの意図が変更されます。

したがって、私は戦略が良い選択だと思っています。