1.1 Definition and Concept
Das Befehlsmuster ist ein Verhaltensmuster, das es ermöglicht, eine Anfrage als Objekt zu kapseln, damit der Client mit verschiedenen Anfragen parametrisiert werden kann.
1.2 Zweck des Befehlsmusters
Der Hauptzweck des Befehlsmusters besteht darin, den Sender und den Empfänger zu entkoppeln. Indem die Anfrage in ein Objekt eingekapselt wird, muss der Sender nur mit dem Befehlsobjekt interagieren, ohne direkt mit dem Empfänger zu interagieren.
2. Merkmale und Vorteile des Befehlsmusters
Das Befehlsmuster hat folgende Merkmale und Vorteile:
- Die Kapselung der Anfrage in ein Objekt entkoppelt den Sender und den Empfänger.
- Es können Anfragen in einer Warteschlange eingereiht, Protokolle aufgezeichnet und Rückgängigoperationen durchgeführt werden.
- Neue Befehle können ohne Änderung des ursprünglichen Codes erweitert werden.
3. Beispiele für praktische Anwendungen des Befehlsmusters
Das Befehlsmuster ist in folgenden Szenarien anwendbar:
- Wenn die Anfrage vom Objekt entkoppelt werden muss, das den Befehl ausführt.
- Unterstützung von Rückgängig- und Wiederholvorgängen.
- Ausführen einer Reihe von Operationen in einer gereihten Weise.
4.1 UML-Klassendiagramm
4.2 Beispiel-Einführung
In diesem Beispiel erstellen wir eine einfache Implementierung des Befehlsmusters. Angenommen, wir haben einen Fernseher als Empfänger, der die Aktionen Ein- und Ausschalten ausführen kann. Wir haben auch eine Fernbedienung als Aufrufer, die spezifische Befehle festlegen und ausführen kann.
4.3.1 Definition des Befehlsinterfaces
type ICommand interface {
Execute()
}
4.3.2 Implementierung der konkreten Befehlsklasse
type ConcreteCommand struct {
receiver IReceiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
4.3.3 Definition des Empfängerinterfaces
type IReceiver interface {
Action()
}
4.3.4 Implementierung der konkreten Empfängerkasse
type Receiver struct {}
func (r *Receiver) Action() {
fmt.Println("Aktion durchführen")
}
4.3.5 Implementierung der Aufruferrolle
type Invoker struct {
command ICommand
}
func (i *Invoker) SetCommand(command ICommand) {
i.command = command
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
4.3.6 Beispiel Client Code
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{receiver: receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
5. Unterschied zwischen dem Befehlsmuster und dem Strategiemuster
Das Befehlsmuster und das Strategiemuster ähneln sich in gewisser Hinsicht, da beide bestimmte Verhaltensweisen in Objekte kapseln. Der Unterschied liegt darin, dass das Befehlsmuster hauptsächlich verwendet wird, um Anfragen als Objekte zu kapseln und Funktionen wie Rückgängigmachen und Ausführungswarteschlangen zu implementieren, während das Strategiemuster hauptsächlich verwendet wird, um eine Reihe von Algorithmen zu kapseln und dynamisch einen Algorithmus zur Laufzeit auszuwählen.
Das Befehlsmuster eignet sich besser für Operationen wie Protokollierung und Buchhaltung, während das Strategiemuster besser für flexible Änderungen in der Geschäftslogik geeignet ist.