De una manera dinamica, es posible adicionar responsabilidades a un objeto
Sea una interfase que proporciona un conjunto de servicios
public interface ControladorIF { .... }See the complete code for ControladorIF here.
public String servicio(String datos);
Una clase que implemente esta interfase puede ser:
public class ControladorUpper implements ControladorIF { .... }See the complete code for ControladorUpper here.
public String servicio(String datos){ return datos.toUpperCase(); }
El cliente de la clase manipula la interfase. Sin embargo, se quiere proveer una nueva clase que implemente al servicio, que ademas de convertir a mayusculas, determine la longitud de la cadena, y si supera una longitud, no la procesa y dispara una excepcion. La clase que cuida la longitud es:
public class CuidadorLongitud { .... }See the complete code for CuidadorLongitud here.
private int _max; public CuidadorLongitud(int max) { _max = max; } public void cuidar(String s) { if (s.length() > _max) { throw new RuntimeException("Longitud excedida"); } }
Se desea que el cliente utilice esta nueva funcion del servicio ControladorIF, para esto se define una clase abstracta.
public abstract class ControladorWrapper implements ControladorIF { .... }See the complete code for ControladorWrapper here.
private ControladorIF wrappee; public ControladorWrapper(ControladorIF wrappee) { this.wrappee = wrappee; } public String servicio(String datos){ return this.wrappee.servicio(datos); }
Dado que es una clase abstracta, la clase concreta extiende a ControladorWrapper e incorpora a un objeto de tipo CuidadorLongitud para controlar la invocacion al metodo servicio
public class ConcretoControladorWrapper extends ControladorWrapper { .... }See the complete code for ConcretoControladorWrapper here.
private CuidadorLongitud cuidador; public ConcretoControladorWrapper(ControladorIF wrappee, CuidadorLongitud cuidador) { super(wrappee); this.cuidador=cuidador; } public String servicio(String datos){ cuidador.cuidar(datos); return super.servicio(datos); }
El cliente se resume a:
public class ClienteDecorator { .... }See the complete code for ClienteDecorator here.
public static void main(String [] args) { ControladorIF ctl = new ConcretoControladorWrapper( new ControladorUpper() , new CuidadorLongitud(10)); System.out.println(ctl.servicio("gus")); }