¡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 Chain of Responsibility
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 Chain of Responsibility

Descripción

El patrón Chain of Responsibility construye una cadena de objetos tal que si un objeto de la cadena no puede responder a la solicitud, puede transmitirla a su sucesor y así sucesivamente hasta que uno de los objetos de la cadena responde.

Ejemplo

Nos situamos en el marco de la venta de vehículos de ocasión. Cuando se muestra el catálogo de vehículos, el usuario puede solicitar una descripción de uno de los vehículos a la venta. Si no se encuentra esta descripción, el sistema debe reenviar la descripción asociada al modelo de este vehículo. Si de nuevo esta descripción no se encuentra, se debe reenviar la descripción asociada a la marca del vehículo. Si tampoco existe una descripción asociada a la marca entonces se envía una descripción por defecto.

De este modo, el usuario recibe la descripción más precisa disponible en el sistema.

El patrón Chain of Responsibility proporciona una solución para llevar a cabo este mecanismo. Consiste en enlazar los objetos entre ellos desde el más específico (el vehículo) al más general (la marca) para formar la cadena de responsabilidad. La solicitud de la descripción se transmite a lo largo de la cadena hasta que un objeto pueda procesarla y enviar la descripción.

El diagrama de objetos UML de la figura 4-2.1 ilustra esta situación y muestra las distintas cadenas de responsabilidad (de izquierda a derecha).

images/rfigure181.PNG

Figura 4-2.1 - Diagrama de objetos de vehículos, modelos y marcas con los enlaces de la cadena de responsabilidad

La figura 4-2.2 representa el diagrama de clases del patrón...

Estructura

1. Diagrama de clases

La figura 4-2.4 describe la estructura genérica del patrón.

images/figure18-4.png

Figura 4-2.4 - Estructura del patrón Chain of Responsibility

2. Participantes

Los participantes del patrón son los siguientes:

  • Gestor (ObjetoBásico) es una clase abstracta que implementa bajo la forma de una asociación la cadena de responsabilidad así como la interfaz de las solicitudes.

  • GestorConcreto1 y GestorConcreto2 (Vehículo, Modelo y Marca) son las clases concretas que implementan el procesamiento de las solicitudes utilizando la cadena de responsabilidad si no pueden procesarlas.

  • Cliente (Usuario) inicia la solicitud inicial en un objeto de una de las clases GestorConcreto1 o GestorConcreto2.

3. Colaboraciones

El cliente realiza la solicitud inicial a un gestor. La solicitud se propaga a lo largo de la cadena de responsabilidad hasta el momento en el que uno de los gestores puede procesarla.

Dominios de aplicación

El patrón se utiliza en los casos siguientes:

  • Una cadena de objetos gestiona una solicitud según un orden que se define dinámicamente.

  • La forma en que una cadena de objetos gestiona una solicitud no tiene por qué conocerse en sus clientes.

Ejemplo en C#

Presentamos a continuación un ejemplo escrito en lenguaje C#. La clase ObjetoBásico se describe a continuación. Implementa la cadena de responsabilidad mediante la propiedad siguiente. Los demás métodos corresponden con las especificaciones presentadas en la figura 4-2.2.

using System; 
 
public abstract class ObjetoBasico 
{ 
    public ObjetoBasico siguiente { protected get; set; } 
 
    private string descripcionPorDefecto() 
    { 
        return "descripción por defecto"; 
    } 
 
    protected abstract string descripcion { get; } 
 
    public string devuelveDescripcion() 
    { 
        string resultado; 
        resultado = this.descripcion; 
        if (resultado != null) 
            return resultado; 
        if (siguiente != null) 
            return siguiente.devuelveDescripcion(); 
        else 
            return this.descripcionPorDefecto(); 
    } 
} 

Las tres subclases concretas de la clase ObjetoBásico son Vehiculo, Modelo...