I. PATRÓN DE DISEÑO: CHAIN OF RESPONSIBILITY

A continuación se encuentra la plantilla del patrón objeto de estudio:

1. Nombre del patrón: Chain of Responsibility.

2. Clasificación del patrón: De comportamiento.

3. Intención: 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.

4. También conocido como: Cadena de responsabilidad.

5. 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.

6. Aplicabilidad:

Este patrón se usa cuando:

Una petición deba ser atendida por más de un objeto
No se conoce cual objeto debe atender la petición, probablemente mas de un objeto la atenderá automáticamente.
Se quiera reducir el acoplamiento
Se quiera ser flexible al atender peticiones

7. Estructura:


8. Participantes:

Manejador: define una interfaz para manejar las peticiones opcionalmente implementa enlaces de sucesión de atención de tales peticiones.
ManejadorConcreto: recibe las peticiones y las atiende si es posible, de otra forma pasa la petición a su sucesor.
Cliente: hace las peticiones a los objetos ManejadorConcreto pertenecientes a la cadena.

9. Colaboraciones:

El cliente hace las peticiones a través de operacion. Los objetos pasan el mensaje a través del método peticion hasta que la solicitud sea atendida por un manejador concreto.

10. 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

11. Código de ejemplo:

abstract class PurchasePower {
protected final double base = 500;
protected PurchasePower successor;
public void setSuccessor(PurchasePower successor){
this.successor = successor;
}
abstract public void processRequest(PurchaseRequest request);
}


class ManagerPPower extends PurchasePower {
private final double ALLOWABLE = 10 * base;
public void processRequest(PurchaseRequest request ) {
if( request.getAmount() < ALLOWABLE )
System.out.println("Manager will approve $"+ request.getAmount());
else
if( successor != null)
successor.processRequest(request);
}
}

class DirectorPPower extends PurchasePower {
private final double ALLOWABLE = 20 * base;
public void processRequest(PurchaseRequest request ) {
if( request.getAmount() < ALLOWABLE )
System.out.println("Director will approve $"+ request.getAmount());
else
if( successor != null)
successor.processRequest(request);
}
}

class VicePresidentPPower extends PurchasePower {
private final double ALLOWABLE = 40 * base;
public void processRequest(PurchaseRequest request) {
if( request.getAmount() < ALLOWABLE )
System.out.println("Vice President will approve $" + request.getAmount());
else
if( successor != null )
successor.processRequest(request);
}
}

class PresidentPPower extends PurchasePower {
private final double ALLOWABLE = 60 * base;

public void processRequest(PurchaseRequest request){
if( request.getAmount() < ALLOWABLE )
System.out.println("President will approve $" + request.getAmount());
else
System.out.println( "Your request for $" + request.getAmount() + " needs a board meeting!");
}
}

class PurchaseRequest {
private int number;
private double amount;
private String purpose;
public PurchaseRequest(int number, double amount, String purpose){
this.number = number;
this.amount = amount;
this.purpose = purpose;
}
public double getAmount() {
return amount;
}
public void setAmount(double amt){
amount = amt;
}
public String getPurpose() {
return purpose;
}
public void setPurpose(String reason) {
purpose = reason;
}
public int getNumber(){
return number;
}
public void setNumber(int num) {
number = num;
}
}

import java.io.*;
public class CheckAuthority {
public static void main(String[] args){
ManagerPPower manager = new ManagerPPower();
DirectorPPower director = new DirectorPPower();
VicePresidentPPower vp = new VicePresidentPPower();
PresidentPPower president = new PresidentPPower();
manager.setSuccessor(director);
director.setSuccessor(vp);
vp.setSuccessor(president);

//enter ctrl+c to kill.
try{
while (true) {
System.out.println("Enter the amount to check who should approve your expenditure.");
System.out.print(">");
double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine());
manager.processRequest(new PurchaseRequest(0, d, "General"));
}
}catch(Exception e){
System.exit(1);
}
}
}


12. Usos Conocidos: La mayoría de las librería de java usan este patrón.

13. Patrones relacionados: Este patrón se puede implementar con: Composite

REFERENCIAS
[1] García Pérez Baltasar. Desarrollo rápido de aplicaciones. Version PDF.
[2] Orjuela Luz Marina. Modelos de Programación: Patrones GOF 10. Universidad Distrital Francisco José de Caldas. 2006.
[3] Cuesta Carlos E. Patrones de Diseño. Ingeniería de software I. Universidad Rey Juan Carlos. Versión PDF.
[4] Romero Tapia Esteban. Ayudantía N° 6. Versión PDF.
[5] http://www.lsi.us.es/docencia/get.php?id=668
[6] http://www.info-ab.uclm.es/asignaturas/42579/pdf/04-Capitulo4b.pdf

No hay comentarios:

Publicar un comentario