1

デコレータ パターンの使用の正確性について苦労しています。Diablo 2 ゲームの例を見てみましょう。宝石で飾ることができるアイテム(例)の剣があり、剣は変更されます(攻撃ポイントの増加や剣の名前の変更など)。この観点からすると、剣は装飾される具体的な物体であり、宝石はデコレーターです。しかし、宝石は独立したスタンドアロンのアイテムとして残ることもでき、名前、説明、その他の指定子もあります。この問題を解決するには? 私は独立した「宝石」を持ち、彼の名前、説明を得ることができますが、この宝石で剣を飾ることもできます. 宝石と剣の両方に、独立した名前や説明などの共通の指定子があることに注意してください。宝石で剣を飾りながら、

4

1 に答える 1

1

ジュエルは同じ機能 (剣など) を表していないため、デコレータにするべきではありません。SwordWithJewelsただし、または疑似コードで次のようにすることもできます。

interface ISword { Stab(); }
class Sword : ISword { Stab();  }
class SwordWithJewels : ISword { Stab(); }

SwordWithJewelsおそらく、宝石を所有する別のオブジェクトを介して直接的または間接的に、構築中に宝石を引数として取り、その情報を使用して、ヒットの強さや名前など、必要なものを計算する必要があります。

ただし、これは単なるオプションであり、コンテキストによってはやり過ぎになる可能性があることに注意してください。宝石を在庫品目と見なす場合は、他のアプローチを使用する方が理にかなっている可能性があります (「これにはパターンを使用する必要がある」という考えから始めると、多くの場合、悪いコードになるため、意図的にパターンという言葉を避けます)。インベントリ アイテムのリストをたどって、それぞれがヒットに強みポイントを追加または削除できるようにすることも理にかなっています。これは、訪問者に似ています (おなじみの名前が必要な場合)。

于 2013-04-14T12:31:11.043 に答える