1

ゲームキャラクターのシナリオを設計するためのデコレータパターンを表す次のUMLダイアグラムでは、次のコードを実行すると、オブジェクトはヒープ内でどのように表示されますか?

デコレータUML

GameCharacter milo;
milo = new Armour (new DefensiveSpell(new Knight()));
milo.Defend();

また、上記のコードは次のコードと同じですか。

GameCharacter milo;
milo = new Knight();
milo = new DefensiveSpell(milo);
milo = new Armour(milo);
milo.Defend();

Knightオブジェクトは、「milo」オブジェクトが指すヒープ上に最初に作成されると思います。次に、DefensiveSpellとArmorが作成されます。DefensiveSpellの「wrapped」オブジェクトは「Knight」を指し、Armorの「wrapped」オブジェクトはDefensiveSpellを指します。また、milo.Defend()コードが実行されると、Defend()メソッドがArmorで呼び出され、DefensiveSpellのDefend()が呼び出され、最終的に何らかの防御アクションを実行する騎士のDefend()が呼び出されると思います。これが私がこれまでに持っている図です:

メモリ図

4

1 に答える 1

1

いくつかのマイナーな点だけで、ほとんど完全に正しいと思います: milo と wraped は、オブジェクト自体ではなく、オブジェクトへの参照です。したがって、 Knight オブジェクトへの参照を含む、DefensiveSpell オブジェクトへの参照を含む Armor オブジェクトが存在します。milo参照は、Knight オブジェクトではなく、Armor オブジェクトを指しています。

また、defend を呼び出すと、呼び出しがスーパークラスに自動的に転送されることはありません。したがって、デコレータが明示的に を呼び出さない限り、base.Defend().

于 2012-04-11T16:09:51.543 に答える