PATRON CHAIN OF RESPONSIBILITY

Motivación:
"Cadena de Responsabilidad".  Permite a un número de clases atender a una petición requerida, sin saber ninguna de ellas las características de las otras. Provee de un cierto desacoplamiento entre las clases. Cada objeto sabe cómo evaluar la petición para una acción y, si no la puede controlar por si mismo, sabe solamente cómo pasarla a otro objeto, por ello la “cadena”.  La cadena de responsabilidad puede ser implementada utilizando una cadena predefinida oestática, o las cadenas pueden ser dinámicas, construidas en tiempo de ejecución teniendo cada objeto su propio sucesor cuando sea necesario.
Estructura:
Participantes:
  • Handler (Aprobación)
Define una interface para el manejo de las solicitudes.
(optional) implementa el sucesor de enlaces.
  • ConcreteHandler (Director, VicePresidente, Presidente)
Se ocupa de las solicitudes, es responsable del acceso al sucesor del enlace. Si el ConcreteHandler puede manejar la solicitud, de lo contrario envía la solicitud a un sucesor.
  • Client (ChainApp)
Inicia la solicitud de un objeto ConcreteHandler en la cadena.
Implementación:
El cliente hace una petición y según la elección, se crea o se hace la accion dependiendo la clase que tenga esa responsabilidad.
public abstract class Pinturas { /*public static int ERR = 3; public static int NOTICE = 5; public static int DEBUG = 7; */ protected String color; protected Pinturas next; // el siguiente elemento en la cadena public Pinturas setNext(Pinturas l) { next = l; return this; } abstract public void mensaje(String msg); }
public class PinturaBlanca extends Pinturas{ public PinturaBlanca() { this.color = "Blanca"; //this.mask = mask; } public void mensaje( String msg ) { if (color.compareTo(msg) == 0) { System.out.println("Pintamos de Blanco"); }else { if (next != null) { next.mensaje(msg); } } } }
public class PinturaAzul extends Pinturas{ public PinturaAzul() { this.color = "Azul"; //this.mask = mask; } public void mensaje( String msg ) { if (color.compareTo(msg) == 0) { System.out.println("Pintamos de Azul"); }else { if (next != null) { next.mensaje(msg); } } } }
public class PinturaAmarilla extends Pinturas{ public PinturaAmarilla() { this.color = "Amarillo"; //this.mask = mask; } public void mensaje( String msg ) { if (color.compareTo(msg) == 0) { System.out.println("Pintamos de Amarillo"); }else { if (next != null) { next.mensaje(msg); } } } }
public class Cliente { public static void main(String[] args) { // Construimos la cadena Pinturas pint = new PinturaAzul().setNext( new PinturaBlanca().setNext( new PinturaAmarilla() ) ); pint.mensaje("Amarillo"); } }
Referencias:

No hay comentarios:

Publicar un comentario