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
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario