1.1 Definición y Concepto
El patrón de comando es un patrón de diseño de comportamiento que permite encapsular una solicitud como un objeto, de manera que se pueda parametrizar al cliente con diferentes solicitudes.
1.2 Propósito del Patrón de Comando
El propósito principal del patrón de comando es desacoplar el emisor y el receptor. Al encapsular la solicitud en un objeto, el emisor solo necesita interactuar con el objeto de comando, sin interactuar directamente con el receptor.
2. Características y Ventajas del Patrón de Comando
El patrón de comando tiene las siguientes características y ventajas:
- La encapsulación de la solicitud en un objeto desacopla el emisor y receptor.
- Puede encolar solicitudes, registrar registros y realizar operaciones de deshacer.
- Se pueden extender nuevos comandos sin cambiar el código original.
3. Ejemplos de Aplicaciones Prácticas del Patrón de Comando
El patrón de comando es aplicable en los siguientes escenarios:
- Necesidad de desacoplar la solicitud del objeto que realiza el comando.
- Soporte para operaciones de deshacer y rehacer.
- Ejecución de un conjunto de operaciones de manera encolada.
4.1 Diagrama de Clase UML
4.2 Introducción del Ejemplo
En este ejemplo, crearemos una implementación simple del patrón de comando. Supongamos que tenemos un televisor como receptor, capaz de realizar las acciones de encendido y apagado. También tenemos un control remoto como invocador, que puede establecer comandos específicos y ejecutarlos.
4.3.1 Definir la Interfaz de Comando
type ICommand interface {
Execute()
}
4.3.2 Implementar la Clase de Comando Concreto
type ConcreteCommand struct {
receiver IReceiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
4.3.3 Definir la Interfaz del Receptor
type IReceiver interface {
Action()
}
4.3.4 Implementar la Clase de Receptor Concreto
type Receiver struct {}
func (r *Receiver) Action() {
fmt.Println("Realizando acción")
}
4.3.5 Implementar el Rol de 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 Ejemplo de Código del Cliente
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{receiver: receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
5. Diferencia Entre el Patrón de Comando y el Patrón de Estrategia
El patrón de comando y el patrón de estrategia son similares hasta cierto punto, ya que ambos encapsulan ciertos comportamientos en objetos. La diferencia radica en que el patrón de comando se utiliza principalmente para encapsular solicitudes como objetos e implementar funciones como deshacer y ejecutar colas, mientras que el patrón de estrategia se utiliza principalmente para encapsular una serie de algoritmos y elegir dinámicamente un algoritmo para ejecutar en tiempo de ejecución.
El patrón de comando es más adecuado para operaciones como registro y contabilidad, mientras que el patrón de estrategia es más adecuado para cambios flexibles en la lógica empresarial.