在下面的UML图中,它表示用于设计游戏角色场景的Decorator模式,当执行下面的代码时,对象在堆中的样子如何?
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()代码时,我相信在Armor中调用Defend()方法将调用DefensiveSpell的Defend(),后者将调用最终执行一些防御动作的骑士的Defend()。 这是我到目前为止的图表:
答案 0 :(得分:1)
你几乎完全正确,只有几点: milo和wrapped是对象的引用,而不是对象本身。因此,将有一个Armor对象,其中包含一个DefensiveSpell对象的引用,该对象包含Knight对象的引用。 milo 引用指向Armor对象,而不是Knight对象。
此外,当您调用防御时,它不会自动将调用转发给超类。所以,除非你的装饰者明确地调用base.Defend()
。