2009-08-26 8 views
8

Ich möchte eine Reihe von Befehlsausführungen ausgeben, aber nur, wenn der vorherige Befehl erfolgreich war. Im Moment hebe ich ein Ereignis innerhalb des Befehlsobjekts an, das anzeigt, ob der Befehl erfolgreich war oder fehlgeschlagen ist. Ich benutze dies, um die Ausführung zu kontrollieren, aber es fühlt sich unelegant an.Befehlsmuster: Ausführen mehrerer Befehle in Sequenz

Beispiel:

command1.CommandSucceeded += delegate { command2.Execute(); }; 
command1.Execute(); 

Dies funktioniert, aber es fühlt sich ungeschickt und wenig intuitiv. Ich könnte einen booleschen Wert von Execute() zurückgeben, der Erfolg oder Misserfolg anzeigt, aber das ist auf dem gleichen Pfad. Ich könnte Ausnahmen bei einem Fehler auslösen, was zu saubererem Code führen könnte, aber möglicherweise übertrieben ist.

Irgendwelche Vorschläge?

Antwort

7

Ich habe dies durch Einrichten eines Befehls "Kette". Ich habe ein Command-Objekt erstellt, das andere Befehle enthält, und feuere dann jedes Mal, wenn Do aufgerufen wird. In Ihrem Fall könnte der Befehl den Delegaten aufrufen und nur den nächsten Befehl in der Sequenz auslösen, wenn er erfolgreich war.

Ein Weg, es zu tun, nehme ich an.

+3

Ja die Verantwortungskette Muster:

List<ICommand> commands = new List<ICommand>; commands.Add(command1); commands.Add(command2); 

Dann wird die Liste der Befehlsobjekte wie folgt ausgeführt. – pjp

+1

Wusste nicht, dass es so genannt wurde. Danke für die Information. –

+0

Das Chain of Responsibility-Muster scheint gut zu passen. Danke für die Antwort. – Josh

1

Die Rückgabe eines Booleschen Objekts oder eines Objekts, das einen Status darstellt, ist nicht so schlimm. Es fühlt sich vielleicht etwas plump an, aber es ist einfach und klar.

Eine Implementierung ich benutze, ist so etwas wie dieses:

Zuerst habe ich hinzufügen, der Befehl eine Liste Objekte in.

foreach (ICommand command in commands) 
{ 
    bool success = command.Execute(); 
    if (!success) break; 
} 
ist nützlich, hier
Verwandte Themen