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

Wzorzec polecenia w Golang

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.