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
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.