1.1 Definição e Conceito
O padrão de comando é um padrão de design comportamental que permite encapsular uma solicitação como um objeto, para que seja possível parametrizar o cliente com diferentes solicitações.
1.2 Objetivo do Padrão de Comando
O principal objetivo do padrão de comando é desacoplar o remetente e o receptor. Ao encapsular a solicitação em um objeto, o remetente só precisa interagir com o objeto de comando, sem interagir diretamente com o receptor.
2. Características e Vantagens do Padrão de Comando
O padrão de comando possui as seguintes características e vantagens:
- Encapsular a solicitação em um objeto desacopla o remetente e o receptor.
- Pode enfileirar solicitações, registrar logs e realizar operações de desfazer.
- Novos comandos podem ser estendidos sem alterar o código original.
3. Exemplos de Aplicações Práticas do Padrão de Comando
O padrão de comando é aplicável nos seguintes cenários:
- Necessidade de desacoplar a solicitação do objeto que executa o comando.
- Suporte a operações de desfazer e refazer.
- Execução de um conjunto de operações de forma enfileirada.
4.1 Diagrama de Classes UML
4.2 Introdução do Exemplo
Neste exemplo, criaremos uma implementação simples do padrão de comando. Suponha que tenhamos uma TV como receptor, capaz de executar as ações de ligar e desligar. Também temos um controle remoto como o invocador, que pode definir comandos específicos e executá-los.
4.3.1 Definir a Interface do Comando
type ICommand interface {
Execute()
}
4.3.2 Implementar a Classe de Comando Concreto
type ConcreteCommand struct {
receiver IReceiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
4.3.3 Definir a Interface do Receptor
type IReceiver interface {
Action()
}
4.3.4 Implementar a Classe de Receptor Concreto
type Receiver struct {}
func (r *Receiver) Action() {
fmt.Println("Realizando ação")
}
4.3.5 Implementar o Papel do Invocador
type Invoker struct {
command ICommand
}
func (i *Invoker) SetCommand(command ICommand) {
i.command = command
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
4.3.6 Exemplo de Código do Cliente
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{receiver: receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
5. Diferença Entre o Padrão de Comando e o Padrão de Estratégia
O padrão de comando e o padrão de estratégia são semelhantes em certa medida, pois ambos encapsulam comportamentos específicos em objetos. A diferença está no fato de que o padrão de comando é principalmente usado para encapsular solicitações como objetos e implementar funções como desfazer e executar filas, enquanto o padrão de estratégia é principalmente usado para encapsular uma série de algoritmos e escolher dinamicamente um algoritmo para executar em tempo de execução.
O padrão de comando é mais adequado para operações como registro e contabilidade, enquanto o padrão de estratégia é mais adequado para mudanças flexíveis na lógica de negócios.