Diferencia entre revisiones de «Patrón command»

m (Texto reemplazado: «<div align="justify">» por «»)
 
(No se muestran 6 ediciones intermedias de 4 usuarios)
Línea 1: Línea 1:
'''Patrón Command'''
+
 
[[Image: Command.jpg|thumb|right|398x254px|Estructura Patrón Command]]
+
{{Ficha Software
''Categoría de Patrón'': Diseño<br>
+
|nombre=Patrón command
''Categoría de Problema'': Organización del trabajo
+
|familia=
==Propósito==
+
|imagen=Command.jpg
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.
+
|tamaño=
== Contexto ==
+
|descripción=Estructura Patrón Command
Quiero ver como se comunican las [[instancias]] de un conjunto de clases.  
+
|imagen2=
== Problema ==
+
|tamaño2=
[[Desacoplar]] las instancias de los objetos que hacen “[[request]]” de los que prestan el servicio (response).  
+
|descripción2=
== Motivación ==
+
|creador=
 +
|desarrollador=
 +
|diseñador=
 +
|modelo de desarrollo=
 +
|fecha de creación=
 +
|lanzamiento inicial=
 +
|versiones=
 +
|última versión estable=
 +
|núcleo=
 +
|tipo de núcleo=
 +
|plataformas soportadas=
 +
|género=
 +
|sistemas operativos=
 +
|idioma=
 +
|licencia=
 +
|premios=
 +
|web=
 +
}}
 +
 
 +
'''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.
 
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==
+
 
 +
===Aplicabilidad===
 +
 
 
Usar Command cuando se quiera:
 
Usar Command cuando se quiera:
# 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]].
+
# 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.
 
# 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.
 
# 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.
 
# 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''.
 
# 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''.
 
# 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.
 
# 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.
 
# 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.
 
# 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==
 
==Estructura==
 
[[Archivo:Command.jpg]]
 
[[Archivo:Command.jpg]]
 
==Participantes==
 
==Participantes==
# '''Orden''': Declara una [[interfaz]] para ejecutar una operación.
+
# ''Orden'': Declara una [[interfaz]] para ejecutar una operación.
# '''OrdenConcreta''': Define un enlace entre un objeto Receptor y una acción. Implementa Ejecutar invocando la correspondiente operación u operaciones del Receptor.
+
# ''Orden Concreta'': Define un enlace entre un objeto Receptor y una acción. Implementa Ejecutar invocando la correspondiente operación u operaciones del Receptor.
# '''Cliente''': Crea un objeto OrdenConcreta y establece su [[receptor]].
+
# ''Cliente'': Crea un objeto OrdenConcreta y establece su [[receptor]].
# '''Invocador''': Le pide a la orden que ejecute la petición.
+
# ''Invocador'': Le pide a la orden que ejecute la petición.
# '''Receptor''': Sabe como llevar a cabo las operaciones asociadas a una petición. Cualquier clase puede actuar como [[Receptor]].
+
# ''Receptor'': Sabe como llevar a cabo las operaciones asociadas a una petición. Cualquier clase puede actuar como [[receptor]]
 +
 
 
==Colaboraciones==
 
==Colaboraciones==
 
# El [[cliente]] crea un objeto ''OrdenConcreta'' y especifica su [[receptor]].
 
# El [[cliente]] crea un objeto ''OrdenConcreta'' y especifica su [[receptor]].
Línea 34: Línea 68:
 
[[Archivo:Command5.jpg]]
 
[[Archivo:Command5.jpg]]
 
==Consecuencias==
 
==Consecuencias==
'''Ventajas'''
+
=== Ventajas ===
# ''Orden'' [[desacopla]] el objeto que invoca la operación de aquel que sabe como realizarla.
+
# ''Orden'' desacopla el objeto que invoca la operación de aquel que sabe como realizarla.
 
# Las ordenes son objetos de primera clase, pueden ser manipulados y extendidos.
 
# Las ordenes son objetos de primera clase, pueden ser manipulados y extendidos.
 
# Se pueden ensamblar ordenes en una orden compuesta (generalmente se usa el [[Patrón Composite]]).
 
# Se pueden ensamblar ordenes en una orden compuesta (generalmente se usa el [[Patrón Composite]]).
 
# Es fácil añadir nuevas órdenes ya que no hay que cambiar las clases existentes.
 
# Es fácil añadir nuevas órdenes ya que no hay que cambiar las clases existentes.
 
== Patrones relacionados ==
 
== Patrones relacionados ==
# El [[Patrón Composite]] se puede usar para órdenes compuestas.
+
# El Patrón Composite se puede usar para órdenes compuestas.
# El [[Patrón Prototype]] puede usarse si una orden debe ser copiada antes de ser guardada en el historial.
+
# El Patrón Prototype puede usarse si una orden debe ser copiada antes de ser guardada en el historial.
 
==Fuentes==
 
==Fuentes==
Blasi Emanuel. Resumen de Patrones de Diseño.  
+
*Erich Gamma. Patrones de Diseño.  
 +
*[http://patronesdediseno.blogspot.com/2009/05/patron-command.html Patron Command] Consultado el [[1 de marzo]] del [[2012]]
 +
*[http://es.wikipedia.org/wiki/Command Wikipedia artículo Command (patron de diseño] Consultado el [[1 de marzo]] del [[2012]] en [[español]]
 +
 
 
[[Category:Ciencias_informáticas]]
 
[[Category:Ciencias_informáticas]]

última versión al 14:31 6 jul 2019

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