Hay muchas explicaciones de patrones de comandos por ahí, pero me resultó un poco difícil de digerir o entender el ejemplo proporcionado en esos blogs/publicaciones.
Así que, aquí trataré de explicarlo de la manera que entendí.
Para entender el patrón de comandos, volvamos a la década de 1990, cuando teníamos TELEVISORES enormes sin control remoto(al menos en la India). Buenos viejos tiempos 😉
Teníamos todas las perillas para encender / apagar, aumentar/disminuir volúmenes.
Todo estaba bien, funcionaba bien, el único problema era que si alguien quería encender/apagar el televisor o reducir / aumentar el volumen, tenía que ir hasta el televisor y usar la perilla.
Ahora piense esto de una manera orientada a objetos. Un TELEVISOR es un objeto que tiene un montón de operaciones/métodos/funciones o «Comando». Estamos accediendo directamente al objeto TV para invocar estos comandos.
El problema con este enfoque?
- Necesita el objeto para invocar un comando-por lo tanto, camine hasta el televisor
- Cada televisor tiene su propia implementación de inicio / parada y no podemos reutilizar la»Invocación de comandos «
- Si otro dispositivo dice» Decodificador «quiere la misma funcionalidad, no hay forma de reutilizar las mismas operaciones- «Control remoto Universal»
¿Cómo podemos resolver esto?
Imagine que el televisor tiene una interfaz que implementa encendido / apagado y otras funcionalidades y expone estos métodos / operaciones, dando la instancia de la interfaz a un «otro objeto». Eso podría resolver nuestro problema. Vamos a entrar en el código:
Primero, crearemos una clase de TV, que tiene las operaciones encendidas / apagadas.
Del mismo modo, crearemos una clase de decodificador a medida que creamos un control remoto universal.
Ahora que hemos definido nuestros dispositivos y sus operaciones, necesitamos una clase (Comando) que pueda guardar objetos de TV/SetTopBox e invocar estas operaciones.
Vamos a crear nuestra clase de comando. Como queremos realizar dos operaciones en estos dispositivos, la clase de comando «tendrá» un objeto de tipo iDevice.
Necesitamos dos comandos » ON » y «OFF».
Estos objetos de comando On / Off tendrán una función/método de ejecución, que invocará la operación respectiva en el dispositivo que tiene.
Si te has dado cuenta, he creado las clases con el nombre «OnCommad» y no «TVOnCommand». La idea es reutilizar la clase de comando para diferentes dispositivos. Ese es nuestro comando universal, que admite cualquier dispositivo.
Esto nos permitirá crear un control remoto universal. ¡Bingo!!!!
Hasta ahora, hemos resumido las operaciones del dispositivo en forma de»Comando». Lo único que nos queda es crear un control remoto, para activar el «comando».
Antes de crear el control remoto, necesitamos crear botones y cada botón ejecutará el comando respectivo.
La clase RemoteButton tiene un objeto de comando, que se ejecuta cuando se presiona el botón.Botón remoto
Finalmente, vamos a crear nuestro Dispositivo de Control Remoto, que tendrá varios botones para cada operación.
Cuando estamos creando un dispositivo de control remoto (usando constructor), instanciaremos todos los objetos y los asignaremos.
Si observa el código anterior, hemos definido varios botones en nuestro Control remoto y estamos tratando de hacer un control remoto universal.
Estamos listos para crear y jugar con nuestro dispositivo de control remoto 🙂
Producto:
TV is on!
TV is off!
SetTopBox is on!
SetTopBox is off!Process finished with exit code 0
Como se ve en la salida, he presionado diferentes botones para realizar un conjunto de operaciones en los Dispositivos.
Así que, en resumen, la idea es darle al cliente(usuario de psvm/TV) un control remoto en lugar de hacerlos caminar hasta la TV o darle TV para encender/apagar la TV 😀
Conclusión
En este post, hablamos sobre el patrón de diseño de comandos.
En palabras simples:
La idea es encapsular las operaciones en un objeto diferente (Comando) y reutilizar y luego crear varios botones para ejecutar estos objetos de comando que tienen operaciones de dispositivo en él.
Como de costumbre, puedes encontrar todo el código en mi GitHub.