2012-04-11 24 views
0

In dem folgenden UML-Diagramm, das ein Decorator-Muster zum Entwerfen von Spielszenenszenario darstellt, wie werden die Objekte in Heap aussehen, wenn der folgende Code ausgeführt wird?Decorator Design Pattern Speicherdiagramm

Decorator UML

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

Außerdem ist der obige Code das gleiche wie dem folgenden Code:

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

Ich glaube, der Ritter Objekt wird mit 'milo' Objekt zeigen zuerst auf dem Heap erstellt werden zu ihm. Dann werden Defensivspell und Rüstung erstellt. Das "gewickelte" Objekt in Defensivspell zeigt dann auf "Ritter" und das "gewickelte" Objekt in Rüstung zeigt auf Verteidigungsspell. Auch wenn milo.Defend() Code ausgeführt wird, glaube ich, dass die Defend() Methode in Armor aufgerufen wird, die Defend() von DefensiveSpell aufrufen wird, die wiederum Defend() des Ritters aufrufen wird, der schließlich eine Verteidigungsaktion durchführt. Hier ist das Diagramm, das ich bisher habe:

Memory diagram

Antwort

1

Sie haben fast völlig richtig es, nur ein paar kleine Punkte: milo und sind Verweise auf Objekte gewickelt, nicht Objekte selbst. Somit wird es ein Armor-Objekt geben, das eine Referenz zu einem DefensiveSpell-Objekt enthält, das eine Referenz zu einem Knight-Objekt enthält. Die Milo Referenz verweist auf das Armor-Objekt, nicht auf das Knight-Objekt.

Auch wenn Sie verteidigen aufrufen, wird es den Anruf nicht automatisch an die Superklasse weiterleiten. Also, außer Ihre Dekoratoren rufen explizit base.Defend().

+0

Danke, das beantwortet meine Frage. – Zizo47