1.1 Definizione e Concetto

Il pattern command è un pattern di progettazione comportamentale che consente di incapsulare una richiesta come un oggetto, in modo che si possa parametrizzare il client con diverse richieste.

1.2 Scopo del Pattern Command

Il principale scopo del pattern command è quello di disaccoppiare mittente e ricevente. Incapsulando la richiesta in un oggetto, il mittente deve interagire solo con l'oggetto command, senza interagire direttamente con il ricevente.

2. Caratteristiche e Vantaggi del Pattern Command

Il pattern command ha le seguenti caratteristiche e vantaggi:

  • L'incapsulamento della richiesta in un oggetto disaccoppia mittente e ricevente.
  • È possibile accodare le richieste, registrare registri e eseguire operazioni di annullamento.
  • I nuovi comandi possono essere estesi senza modificare il codice originale.

3. Esempi di Applicazioni Pratiche del Pattern Command

Il pattern command è applicabile nei seguenti scenari:

  • Necessità di disaccoppiare la richiesta dall'oggetto che esegue il comando.
  • Supporto per operazioni di annullamento e ripetizione.
  • Esecuzione di un insieme di operazioni in modo sequenziale.

4.1 Diagramma delle Classi UML

Golang Command Pattern

4.2 Introduzione dell'Esempio

In questo esempio, creeremo una semplice implementazione del pattern command. Supponiamo di avere una TV come ricevente, in grado di eseguire le azioni di accensione e spegnimento. Abbiamo anche un telecomando come invocatore, che può impostare comandi specifici ed eseguirli.

4.3.1 Definire l'Interfaccia del Command

type ICommand interface {
    Execute()
}

4.3.2 Implementare la Classe Command Concreta

type ConcreteCommand struct {
    receiver IReceiver
}

func (c *ConcreteCommand) Execute() {
    c.receiver.Action()
}

4.3.3 Definire l'Interfaccia del Ricevente

type IReceiver interface {
    Action()
}

4.3.4 Implementare la Classe Ricevente Concreta

type Receiver struct {}

func (r *Receiver) Action() {
    fmt.Println("Esecuzione azione")
}

4.3.5 Implementare il Ruolo dell'Invocatore

type Invoker struct {
    command ICommand
}

func (i *Invoker) SetCommand(command ICommand) {
    i.command = command
}

func (i *Invoker) ExecuteCommand() {
    i.command.Execute()
}

4.3.6 Esempio di Codice Client

func main() {
    receiver := &Receiver{}
    command := &ConcreteCommand{receiver: receiver}
    invoker := &Invoker{}
    invoker.SetCommand(command)
    invoker.ExecuteCommand()
}

5. Differenza tra Pattern Command e Pattern Strategy

Il pattern command e il pattern strategy sono simili fino a un certo punto, poiché entrambi incapsulano determinati comportamenti in oggetti. La differenza sta nel fatto che il pattern command è principalmente utilizzato per incapsulare le richieste come oggetti ed implementare funzioni come annullamento ed esecuzione in code, mentre il pattern strategy è principalmente utilizzato per incapsulare una serie di algoritmi e scegliere dinamicamente un algoritmo da eseguire a tempo di esecuzione.

Il pattern command è più adatto per operazioni come registrazione e contabilità, mentre il pattern strategy è più adatto per cambiamenti flessibili nella logica aziendale.