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 中的“包裹”对象将指向“Knight”,Armor 中的“包裹”对象将指向 DefensiveSpell。另外,当执行 milo.Defend() 代码时,我相信在 Armor 中会调用 Defend() 方法,该方法将调用 DefensiveSpell 的 Defend() ,而后者又会调用骑士的 Defend() ,最终执行一些防御动作。这是我到目前为止的图表:

内存图

4

1 回答 1

1

您几乎完全正确,只是几个小问题: milo 和 Wrapped 是对对象的引用,而不是对象本身。因此,将有一个 Armor 对象,其中包含对 DefensiveSpell 对象的引用,该对象包含对 Knight 对象的引用。milo引用指向 Armor 对象,而不是 Knight 对象。

此外,当您调用 defer 时,它不会自动将调用转发给超类。因此,除非您的装饰器明确调用base.Defend().

于 2012-04-11T16:09:51.543 回答