lunes, 19 de noviembre de 2007

Patrón de Diseño, Chain of Responsibility

Evita acoplamiento al remitente de una petición a su receptor dando la posibilidad de un objeto de tramitar la solicitud. Cadena de la recepción de los objetos y pasar la solicitud a lo largo de la cadena hasta que un objeto se ocupa de él.

Este Patron es muy poco usado.



Participantes

Las clases y / o de los objetos que participan en este modelo son:

* Handler
Define una interfaz para el manejo de las solicitudes
(Opcional) implementa el sucesor enlace
* ConcreteHandler
Se ocupa de las solicitudes que es responsable
Puede acceder a su sucesor
Si el ConcreteHandler puede tramitar la solicitud, lo hace; de otra forma, lo que remite la solicitud a su sucesor
* Client
Inicia la petición a un ConcreteHandler objeto en la cadena













Puedes bajar el ejemplo y probarlo en tu pc. Fue desarrollado en Eclipse con Java 1.6SE
[descargar]

Este es el codigo Java,

abstract class Handler{

protected Handler successor;


public void SetSuccessor(Handler successor){
this.successor = successor;
}

public abstract void HandleRequest(int request);
}

class ConcreteHandler1 extends Handler{
public void HandleRequest(int request){
if (request >= 0 && request < 10){
System.out.println(this.getClass().toString() + " handled request " + request);
} else if (successor != null){
successor.HandleRequest(request);
}
}
}

class ConcreteHandler2 extends Handler{
public void HandleRequest(int request) {
if (request >= 10 && request < 20){
System.out.println(this.getClass().toString() + " handled request " + request);
} else if (successor != null){
successor.HandleRequest(request);
}
}
}

class ConcreteHandler3 extends Handler{
public void HandleRequest(int request) {
if (request >= 20 && request < 30){
System.out.println(this.getClass().toString() + " handled request " + request);
}else if (successor != null){
successor.HandleRequest(request);
}
}
}


public class Main {

public static void main(String[] args) {
// Configuracion del Chain of Responsibility
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);

// Generar y procesar request
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};

for(int request : requests){
h1.HandleRequest(request);
}
}
}

2 comentarios:

Anónimo dijo...

exelente blog.

Felipe dijo...

gracias jonasoft.
He dejado el blog muy de lado pero ahora volvere a publicar mas cosas