¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Command
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

El patrón Command

Descripción

El patrón Command tiene como objetivo transformar una solicitud en un objeto, facilitando operaciones tales como la anulación, el encolamiento de solicitudes y su seguimiento.

Ejemplo

En ciertos casos, la gestión de una solicitud puede ser bastante compleja: puede ser anulable, encolada o trazada. En el marco del sistema de venta de vehículos, el gestor puede solicitar al catálogo rebajar el precio de los vehículos de ocasión que llevan en el stock cierto tiempo. Por motivos de simplicidad, esta solicitud debe poder ser anulada y, eventualmente, restablecida.

Para gestionar esta anulación, una primera solución consiste en indicar a nivel de cada vehículo si está o no rebajado. Esta solución no es suficiente pues un mismo vehículo puede estar rebajado varias veces con tasas diferentes. Otra solución sería conservar su precio antes de la última rebaja, aunque esta solución no es satisfactoria pues la anulación puede realizarse sobre otra solicitud de rebaja que no sea la última.

El patrón Command resuelve este problema transformando la solicitud en un objeto cuyos atributos van a contener los parámetros así como el conjunto de objetos sobre los que la solicitud va a ser aplicada. En nuestro ejemplo, esto hace posible anular o restablecer una solicitud de rebaja.

La figura 4-3.1 ilustra esta aplicación del patrón Command a nuestro ejemplo. La clase SolicitudRebaja almacena sus dos parámetros (tasaDescuento y tiempoEnStock) así como la lista de vehículos para los que se ha aplicado...

Estructura

1. Diagrama de clases

La figura 4-3.3 detalla la estructura genérica del patrón.

images/figure19-3.png

Figura 4-3.3 - Estructura del patrón Command

2. Participantes

Los participantes del patrón son los siguientes:

  • Solicitud es la interfaz que presenta la firma del método ejecuta que ejecuta la solicitud;

  • SolicitudConcreta (SolicitudRebaja) implementa el método ejecuta, gestiona la asociación con el o los receptores e implementa el método almacenaAnulación que almacena el estado (o los valores necesarios) para poder anularla a continuación;

  • Cliente (Usuario) crea e inicializa la solicitud y la transmite al solicitante;

  • Solicitante (Catálogo) almacena y ejecuta la solicitud (método almacenaEjecuciónSolicitud) así como eventualmente las solicitudes de anulación;

  • Receptor (Vehículo) ejecuta las acciones necesarias para realizar la solicitud o para anularla.

3. Colaboraciones

La figura 4-3.4 ilustra las colaboraciones del patrón Command:

  • El cliente crea una solicitud concreta especificando el o los receptores.

  • El cliente transmite esta solicitud al método almacenaEjecuciónSolicitud del solicitante para almacenar la solicitud.

  • El solicitante ejecuta a continuación la solicitud llamando al método ejecuta.

  • El estado o los datos necesarios para realizar la anulación se almacenan (método almacenaAnulación).

  • La solicitud pide...

Dominios de aplicación

El patrón se utiliza en los casos siguientes:

  • Un objeto debe configurarse para realizar un procesamiento concreto. En el caso del patrón Command, es el solicitante el que se configura mediante una solicitud que contiene la descripción de un procesamiento a realizar sobre uno o varios receptores.

  • Las solicitudes deben encolarse y poder ejecutarse en un momento cualquiera, eventualmente varias veces.

  • Las solicitudes pueden ser anuladas.

  • Las solicitudes deben quedar registradas en un archivo de log.

  • Las solicitudes deben estar reagrupadas bajo la forma de una transacción. Una transacción es un conjunto ordenado de solicitudes que actúan sobre el estado de un sistema y que pueden ser anuladas.

Ejemplo en C#

Presentamos a continuación un ejemplo escrito en C#. La clase Vehiculo se describe en C# como aparece a continuación. Cada vehículo posee un nombre, una fecha de entrada en el almacén y un precio de venta. El método modificaPrecio permite ajustar el precio mediante un coeficiente.

using System; 
 
public class Vehiculo 
{ 
    protected string nombre; 
    protected long fechaEntradaStock; 
    protected double precioVenta; 
 
    public Vehiculo(string nombre, long fechaEntradaStock, 
        double precioVenta) 
    { 
        this.nombre = nombre; 
        this.fechaEntradaStock = fechaEntradaStock; 
        this.precioVenta = precioVenta; 
    } 
 
    public long getTiempoEnStock(long hoy) 
    { 
        return hoy - fechaEntradaStock; 
    } 
 
    public void modificaPrecio(double coeficiente) 
    { 
        this.precioVenta = 0.01 * Math.Round(coeficiente * 
        this.precioVenta * 100); 
    } 
 
    public void visualiza() 
    { 
          Console.WriteLine(nombre + " precio: " + precioVenta + 
          " fecha entrada stock " + fechaEntradaStock); 
    } 
} 

La clase SolicitudRebaja posee los siguientes atributos:

  • vehiculosRebajados: la lista de vehículos rebajados;

  • hoy: el valor del día de hoy;

  • tiempoEnStock: la duración del almacenamiento que debe superar un vehículo para poder ser rebajado;

  • tasaDescuento: el porcentaje de descuento que se pretende aplicar sobre los vehículos rebajados.

El método rebaja calcula en primer lugar los vehículos que deben...