Diferencia entre revisiones de «Cadena de responsabilidad»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Alecs.bot (discusión · contribs.)
m robot Añadido: zh:责任链模式
Línea 4: Línea 4:


Se utiliza, por ejemplo, cuando en función del estado del sistema las peticiones emitidas por un objeto deben ser atendidas por distintos objetos receptores.
Se utiliza, por ejemplo, cuando en función del estado del sistema las peticiones emitidas por un objeto deben ser atendidas por distintos objetos receptores.
sadadasdasdasdasd


== Implementación ==
== Implementación ==

Revisión del 22:40 9 sep 2008

El patrón de diseño Chain of Responsibility permite establecer una cadena de objetos receptores a través de los cuales se pasa una petición formulada por un objeto emisor. Cualquiera de los objetos receptores puede responder a la petición en función de un criterio establecido.

Motivación

Se utiliza, por ejemplo, cuando en función del estado del sistema las peticiones emitidas por un objeto deben ser atendidas por distintos objetos receptores. sadadasdasdasdasd

Implementación

Todos los objetos receptores implementarán la misma interfaz o extenderán la misma clase abstracta. En ambos casos se proveerá de un método que permita obtener el sucesor y así el paso de la petición por la cadena será lo más flexible y transparente posible.

Ejemplos

Java

El siguiente código java muestra un ejemplo de este patrón para una clase que hace un 'log'. Cada elemento de log decide si debe de mostrar el log dependiendo de su nivel de log y pasa el mensaje al siguiente elemento. La salida será:

Escribiendo en DEBUG: Entrando en function y.
Escribiendo en DEBUG: Paso 1 completado
Escribiendo en STDERR: Paso 1 completado.
Escribiendo en DEBUG: Error occurrido.
Enviando un  e-mail: Error occurrido.
Escribiendo en STDERR: Error occurrido.

Observese que una implementación 'pura' de este patrón detendría la cadena. En este ejemplo no ocurre así.

import java.util.*;
 
abstract class Logger {
   public static int ERR = 3;
   public static int NOTICE = 5;
   public static int DEBUG = 7;
   protected int mask;

   protected Logger next; ''// el siguiente elemento en la cadena''
   public Logger setNext(Logger l) { next = l; return this; }

   abstract public void message(String msg, int priority);
}

class DebugLogger extends Logger{
   public DebugLogger(int mask) { this.mask = mask; }

   public void message(String msg, int priority) {
       if (priority <= mask) System.out.println("Escribiendo en DEBUG: "+msg);
       if (next != null) next.message(msg, priority);
   }
}

class EMailLogger extends Logger{
   public EMailLogger(int mask) { this.mask = mask; }

   public void message(String msg, int priority) {
       if (priority <= mask) System.out.println("Enviando un  e-mail:      "+msg);
       if (next != null) next.message(msg, priority);
   }
}

class StderrLogger extends Logger{
   public StderrLogger(int mask) { this.mask = mask; }

   public void message(String msg, int priority) {
       if (priority <= mask) System.out.println("Escribiendo en STDERR:       "+msg);
       if (next != null) next.message(msg, priority);
   }
}

class ChainOfResponsibilityExample{
   public static void main(String[] args) {
       ''// Construimos la cadena''
       Logger l = new DebugLogger(Logger.DEBUG).setNext(
                   new EMailLogger(Logger.ERR).setNext( 
                    new StderrLogger(Logger.NOTICE) ) );

       ''// Ejecutamos''
       l.message("Entrando en function y.", Logger.DEBUG);    ''// handled by DebugLogger''
       l.message("paso 1 completado.", Logger.NOTICE);       ''// handled by Debug- and StderrLogger''
       l.message("Ha ocurrido un error.", Logger.ERR);     ''// handled by all three Logger''
   }
}


La plantilla {{Esbozo}} está obsoleta tras una consulta de borrado, no se debe usar.