2

編集:Actionscript3.0および/またはJavaを使用できます

デコレータクラスに少し問題があります。抽象クラスのサブクラスのサブクラスを装飾できるようにしたい。

明確にするために; 私はabstract weapon class、をabstract sword class拡張します。そして、最後にそれをconcrete long sword class拡張します。飾れるようになりたいですlong sword class

                                   Weapon <-------------Enchant "Decorator
                                     /\                  /   \
                                    /  \        "+3 damage"|"Paralyze"
                                   /    \                  V
"Abstract Components":       Sword    |    Axe    "Concrete Decorators" 
                              / \         /    \
                             /   \       /      \
"Concrete Components": LongSword|Short RedAxe| WarAxe "Apply Decorators Here"

現在、私がデザインパターンについて読んだすべての本は、「1層」の装飾を扱っています。

                                        Weapon <-------------Enchant "Decorator
                                         /\                  /   \
                                        /  \        "+3 damage"|"Paralyze"
                                       /    \                  V
  "Concrete components already":    Sword | Axe      "Concrete Decorators"
4

2 に答える 2

1
public abstract class weapon
{
list WeaponDecorator decorators;
hit()
{for each decorator in decorators {
 decorator.hit();}}
}

public abstract class axe : weapon
{hit()}

public class broadaxe : axe
{hit(){
parent.hit();    
implementation;}}

public class WeaponDecorator : weapon
{hit(){
 implement freeze()
}}

私があなたの図を正しく理解していれば、これは擬似コードでの実装であるはずです。

于 2012-04-08T10:51:29.550 に答える
1

Java、C ++、(おそらく)C#のような静的言語では、クラスのデコレータを作成し、それを使用してそのクラスのサブクラスをデコレートすることはできません。できますが、その効果はサブクラスの機能を隠すことです。

あなたが望んでいるのは、デコレータを組み合わせて使用​​できるようにすることだと思います。各デコレータは、オブジェクトのクラスまたはその祖先の1つに使用できます。

perlやrubyなどの動的言語では、個々のオブジェクトの個々のメソッドを定義または再定義でき、理論的にはこれを使用してサブクラスの装飾を実行できます。

静的言語に制約されていると仮定すると、私の提案は次のとおりです。必要なエンチャントの種類ごとに、修飾子の基本クラスまたはインターフェイスを作成してから、エンチャントごとに具象クラスを作成します。次に、各オブジェクトで、各クラス/インターフェイスの修飾子のリストを作成し、必要に応じてそれらを実行して、たとえばダメージを計算します。

最も近い類似パターンは、戦略またはテンプレートメソッドです。

私はあなたの質問を「Diabloゲームで使用されるアイテム修飾子システムをどのように実装するのか」に翻訳しました。考慮すべき多くの問題があります。状態の保存と復元、および修飾子間の相互作用は、現在私が直面している2つにすぎません。

于 2012-04-08T11:05:31.403 に答える