Cadenarespon

398 views
342 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
398
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Cadenarespon

  1. 1. Patrón Chain of Responsibility 1. Nombre: Chain of Responsibility 2. Clasificació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.
  2. 2. <ul><li>6. Aplicabilidad : Usaremos este patrón cuando: </li></ul><ul><li>Una petición deba ser atendida por más de un objeto </li></ul><ul><li>No se conoce cual objeto debe atender la petición, probablemente mas de un objeto la atenderá automáticamente. </li></ul><ul><li>Se quiera reducir el acoplamiento </li></ul><ul><li>Se quiera ser flexible al atender peticiones </li></ul>
  3. 3. 7. Estructura : sucesor Manejador1 + peticion() (A)Manejador + peticion() Client +operacion() Manejador1 + peticion()
  4. 4. <ul><li>8. Participantes : </li></ul><ul><li>Manejador : define una interfaz para manejar las peticiones opcionalmente implementa enlaces de sucesión de atención de tales peticiones. </li></ul><ul><li>• ManejadorConcreto : recibe las peticiones y las atiende si es posible, de otra forma pasa la petición a su sucesor. </li></ul><ul><li>• Cliente : hace las peticiones a los objetos ManejadorConcreto pertenecientes a la cadena. </li></ul>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.
  5. 5. 11. 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
  6. 6. 12. Código de ejemplo : Manager-->Director-->Vice President-->President 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(&quot;Manager will approve $&quot;+ request.getAmount()); else if( successor != null) successor.processRequest(request); } }
  7. 7. class DirectorPPower extends PurchasePower { private final double ALLOWABLE = 20 * base; public void processRequest(PurchaseRequest request ) { if( request.getAmount() < ALLOWABLE ) System.out.println(&quot;Director will approve $&quot;+ 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(&quot;Vice President will approve $&quot; + request.getAmount()); else if( successor != null ) successor.processRequest(request); } }
  8. 8. class PresidentPPower extends PurchasePower { private final double ALLOWABLE = 60 * base; public void processRequest(PurchaseRequest request){ if( request.getAmount() < ALLOWABLE ) System.out.println(&quot;President will approve $&quot; + request.getAmount()); else System.out.println( &quot;Your request for $&quot; + request.getAmount() + &quot; needs a board meeting!&quot;); } }
  9. 9. 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; } }
  10. 10. 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(&quot;Enter the amount to check who should approve your expenditure.&quot;); System.out.print(&quot;>&quot;); double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine()); manager.processRequest(new PurchaseRequest(0, d, &quot;General&quot;)); } }catch(Exception e){ System.exit(1); } } }
  11. 11. <ul><li>14. Patrones relacionados : </li></ul><ul><li>Composite </li></ul>13. Usos conocidos : La mayoría de las librería de java usan este patrón.

×