5

Warum muss ich Chain of Responsibility verwenden, wenn ich alle Befehle in einen Container laden und Befehle nur nacheinander ausführen könnte. Dies führt dazu, dass eine Verarbeitungskette eine Anfrage hintereinander bearbeitet. BTW Ich denke, dass es besser als CoR ist, weil Sie einige bestimmte Befehle entfernen oder durch einen anderen Befehl zur Laufzeit ersetzen können, während Sie für CoR eine andere Kette erstellen müssen, um etwas in der Kette zu ändern, da Sie keinen Zugriff auf Elemente in der Kette außer dem ersten Element. (Es ist eigentlich eine einzige verkettete Liste.)Chain of Responsibility vs Befehle in einer Warteschlange oder Stack

Antwort

1

einfach zu „keep it simple albern“ :-)

Erstellen Sie eine Warteschlange/Stapel, wenn Sie speziell es brauchen, und Sie würden wissen, wenn Sie es brauchen , nicht wahr?

Für Beispiel-, wenn Sie wie ein paar einfache Datenmanipulation zu tun hatte:

data.clean().format().save(); 

vs

commands.push(new Cleaner(data)); 
commands.push(new Formatter(data)); 
commands.push(new Updates(data)); 
commands.execute(); 

auch feststellen, musste ich mehr Code schreiben, um neue Datenstruktur zu erstellen (Befehle stapeln).

Aber lassen Sie uns sagen, es war etwas strategischer, sagen Sie ein Shooter-Spiel. Der Spieler kann erschossen, getötet usw. werden, und die Ergebnisse hängen vom gewählten Schwierigkeitsgrad des Spiels ab.

In diesem Fall mussten wir eine Strategie erstellen, die zur Laufzeit weitergegeben und ausgeführt werden kann

Also im bodyShot kann das letzte Element (LooseHealth) nicht vorhanden sein, und headShot kann LooseHealth anstelle von KillPlayer als letztes Element haben.

Ich hoffe, es hilft.

+0

Welches ist einfach? COR oder Stapel? Für mich sind beide gleich. – Narek

+0

OK, siehe die bearbeitete Antwort oben – Nishant

+0

Sie haben Stack mit statischem 'data.clean(). Format() verglichen. Save();'. Aber ich fragte Stack vs COR, wie Laufzeitänderungen in beiden durchgeführt werden können, da in COR Sie neue Ketten erstellen können. – Narek

0

Ich glaube nicht, dass CoR eine einfach verknüpfte Liste benötigt. Das mag eine gemeinsame Implementierung sein; Es kann jedoch eine doppelt verknüpfte Liste oder praktisch jede andere Sammlung/jeder andere Container verwendet werden, solange sie den Nachrichtensender von den Nachrichtenempfängern entkoppelt. Was Sie beschreiben, klingt perfekt mit dem CoR-Muster. Sie haben einfach die Möglichkeit zur Konfiguration der Kette erweitert. Es ist wichtig zu beachten, dass die GoF definition uns anweist, die Kette zu implementieren,

ohne Festverdrahtung Handler Beziehungen und Vorrang,

... aber ich glaube nicht, dass unsere Wahl beschränken sollte Sammlung für die Handler.


Beachten Sie auch, dass eine Verantwortungskette nicht dasselbe wie eine Kette der Verarbeitung ist. Letzteres impliziert sequentielle Operationen (d. H. A pipeline), während ersteres hierarchisch ist, aber nicht notwendigerweise sequentiell. Jede Anzahl und Kombination von Handlern (oder keiner von ihnen) kann auf eine einzelne Anfrage einwirken.

Schließlich nehme ich an, die Verwendung des Wortes "Befehle" in der Frage ist ein Verweis auf die Handler in der Kette, und kein Verweis auf die Command Pattern. Das AdR- und das Command-Muster können sich in Bezug auf die Anfragen an die Chain ergänzen, aber traditionell nicht in Bezug auf Commands als Handler.