1.1 Definicja i Koncepcja
Wzorzec polecenia to behawioralny wzorzec projektowy, który pozwala enkapsulować żądanie jako obiekt, dzięki czemu można parametryzować klienta różnymi żądaniami.
1.2 Cel wzorca polecenia
Głównym celem wzorca polecenia jest odseparowanie nadawcy od odbiorcy. Poprzez enkapsulację żądania w obiekcie, nadawca potrzebuje tylko współdziałać z obiektem poleceń, bez bezpośredniej interakcji z odbiorcą.
2. Charakterystyka i Zalety Wzorca Polecenia
Wzorzec polecenia ma następujące cechy i zalety:
- Enkapsulacja żądania w obiekcie odseparowuje nadawcę od odbiorcy.
- Można kolejkować żądania, rejestrować dzienniki i wykonywać operacje cofania.
- Nowe polecenia można rozszerzać bez zmiany oryginalnego kodu.
3. Przykłady praktycznych zastosowań wzorca polecenia
Wzorzec polecenia jest stosowany w następujących scenariuszach:
- Potrzeba odseparowania żądania od obiektu wykonującego polecenie.
- Obsługa operacji cofania i przywracania.
- Wykonywanie zestawu operacji w kolejkowany sposób.
4.1 Diagram klas UML
4.2 Wprowadzenie do przykładu
W tym przykładzie stworzymy prostą implementację wzorca polecenia. Załóżmy, że mamy odbiornik TV, zdolny do wykonywania akcji włączania i wyłączania. Mamy również zdalny kontroler jako wywoływacz, który może ustawiać określone polecenia i wykonywać je.
4.3.1 Zdefiniuj interfejs polecenia
type ICommand interface {
Execute()
}
4.3.2 Zaimplementuj klasę konkretnej komendy
type ConcreteCommand struct {
receiver IReceiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
4.3.3 Zdefiniuj interfejs odbiorcy
type IReceiver interface {
Action()
}
4.3.4 Zaimplementuj konkretną klasę odbiorcy
type Receiver struct {}
func (r *Receiver) Action() {
fmt.Println("Wykonywanie akcji")
}
4.3.5 Zaimplementuj rolę wywoływacza
type Invoker struct {
command ICommand
}
func (i *Invoker) SetCommand(command ICommand) {
i.command = command
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
4.3.6 Przykład kodu klienta
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{receiver: receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
5. Różnice między wzorcem polecenia a wzorcem strategii
Wzorzec polecenia i wzorzec strategii są podobne do pewnego stopnia, ponieważ oba enkapsulują określone zachowania w obiektach. Różnica polega na tym, że wzorzec polecenia służy głównie do enkapsulacji żądań jako obiektów i implementacji funkcji takich jak cofanie i kolejkowanie wykonania, podczas gdy wzorzec strategii służy głównie do enkapsulacji serii algorytmów i dynamicznego wybierania jednego algorytmu do wykonania w czasie wykonania.
Wzorzec polecenia bardziej nadaje się do operacji takich jak rejestrowanie i księgowanie, podczas gdy wzorzec strategii jest bardziej odpowiedni do elastycznych zmian w logice biznesowej.