Patrón command

Patrón command
Información sobre la plantilla
Command.jpg
Estructura Patrón Command

Patrón command. El propósito es, encapsula una petición en un objeto, permitiendo así parametrizar a los clientes con diferentes peticiones, hacer cola o llevar un registro de las peticiones y poder deshacer las operaciones.

Contexto y problema

Quiero ver como se comunican las instancias de un conjunto de clases.

Problema

Desacoplar las instancias de los objetos que hacen “request” de los que prestan el servicio (response).

Motivación y aplicabilidad

A veces es necesario enviar peticiones a objetos sin saber nada acerca de la operación solicitada o de quien es el receptor de la petición.

Aplicabilidad

Usar Command cuando se quiera:

  1. Parametrizar objetos con una acción a realizar. En un lenguaje procedural se puede expresar dicha parametrización con una función callback (registrada en algún sitio para que sea llamada mas tarde). Los objetos Orden son un sustituto orientado a objetos para las funciones callback.
  2. Especificar, poner en cola y ejecutar peticiones en diferentes instantes de tiempo. Un objeto Orden puede tener un tiempo de vida independiente de la petición original.
  3. Permitir deshacer. La operación Ejecutar de Orden puede guardar un estado y la operación en una lista “historial”. Debe añadirse una operación Deshacer que anule los efectos de una llamada anterior a Ejecutar. Se pueden lograr niveles ilimitados recorriendo el historial, llamando respectivamente a Deshacer y Ejecutar.
  4. Permitir registrar los cambios de manera que se puedan volver a aplicar en caso de una caída del sistema. Aumentando la interfaz de Orden con operaciones para cargar y guardar se puede mantener un registro persistente de los cambios.
  5. Ofrecer un modo de modelar transacciones (encapsular un conjunto de cambios sobre unos datos). Las órdenes tienen una interfaz común, permitiendo así invocar a todas las transacciones del mismo modo.

Estructura

Command.jpg

Participantes

  1. Orden: Declara una interfaz para ejecutar una operación.
  2. Orden Concreta: Define un enlace entre un objeto Receptor y una acción. Implementa Ejecutar invocando la correspondiente operación u operaciones del Receptor.
  3. Cliente: Crea un objeto OrdenConcreta y establece su receptor.
  4. Invocador: Le pide a la orden que ejecute la petición.
  5. Receptor: Sabe como llevar a cabo las operaciones asociadas a una petición. Cualquier clase puede actuar como receptor

Colaboraciones

  1. El cliente crea un objeto OrdenConcreta y especifica su receptor.
  2. Un objeto Invocador almacena el objeto OrdenConcreta.
  3. El Invocador envía una petición llamando a Ejecutar sobre la orden. Cuando las órdenes se pueden deshacer, OrdenConcreta guarda el estado para deshacer la orden antes de llamar a Ejecutar.
  4. El objeto OrdenConcreta invoca operaciones de su receptor para llevar a cabo la petición.

El siguiente diagrama muestra las interacciones entre los objetos. Command5.jpg

Consecuencias

Ventajas

  1. Orden desacopla el objeto que invoca la operación de aquel que sabe como realizarla.
  2. Las ordenes son objetos de primera clase, pueden ser manipulados y extendidos.
  3. Se pueden ensamblar ordenes en una orden compuesta (generalmente se usa el Patrón Composite).
  4. Es fácil añadir nuevas órdenes ya que no hay que cambiar las clases existentes.

Patrones relacionados

  1. El Patrón Composite se puede usar para órdenes compuestas.
  2. El Patrón Prototype puede usarse si una orden debe ser copiada antes de ser guardada en el historial.

Fuentes