jueves, 21 de abril de 2016

Patrones de Diseño Estructurales Parte 2

9. Decorator:  Este patrón está hecho para decorar una clase base, es como una envoltura que podemos colocar sobre una clase y que le agrega funcionalidad a esta, estas envolturas las podemos poner en el orden que queramos, combinarlas, ponerlas mas de una vez e incusive quitarlas. Responde a la necesidad de agregar funcionalidad a un objeto por medio de la asociación de clases. Es un objeto con el que se puede ejecutar funcionalidades de varias clases a la vez. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, sino otras que la implementan y se asocian a la primera. El patrón Decorator responde a la necesidad de añadir dinámicamente funcionalidad a un Objeto. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, si no otras que la implementan y se asocian a la primera.

Diagrama UML.
Crea una interface

public interface Shape {
   void draw();
}

Crea clases concreta implementando las misma interface.

public class Rectangle implements Shape {
 @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}


Crear clases abstracta decorator implementando la interface Shape


public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }   
}

Crear clases concreta decorator extendiendo la clase ShapeDecorator.

public class RedShapeDecorator extends ShapeDecorator {

   public RedShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);       
   }

   @Override
   public void draw() {
      decoratedShape.draw();          
      setRedBorder(decoratedShape);
   }

   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }
}

Usar el RedShapeDecorator a decorar objetos Shape.

public class DecoratorPatternDemo {
   public static void main(String[] args) {

      Shape circle = new Circle();

      Shape redCircle = new RedShapeDecorator(new Circle());

      Shape redRectangle = new RedShapeDecorator(new Rectangle());
      System.out.println("Circle with normal border");
      circle.draw();

      System.out.println("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle of red border");
      redRectangle.draw();
   }
}

10. Facade: Se encarga de proveernos de una interfaz más sencilla, para trabajar sólo con ella, y ello nos evita tener que instanciar objetos de un conjunto de clases para sólo aprovechar algunos métodos de tales clases. Facade por lo general requiere de una unica instancia, por ello suele aplicarse el patrón  singleton sobre la fachada, o bien sus métodos como estáticos(de clase). Se aplicará el patrón fachada cuando se necesite proporcionar una interfaz simple para un subsistema complejo, o cuando se quiera estructurar varios subsistemas en capas, ya que las fachadas serían el punto de entrada a cada nivel. Su objetivo principal es proporcionar una interfaz simplificada para un grupo  de subsistemas o un sistema complejo.

Diagrama UML
Ejemplo
Problema un cliente necesita conectarse a una impresora pero desconoce el nombre del impreso y la configuración de la misma solo sabe el texto que la envía a la misma que se debe imprimir, el cliente (como todo cliente/usuario) al meter manos en este dispositivo puede ocasionar problemas graves.
 Impresora

package ar.com.patronesdisenio.facade.impresora;
/**
 * @author nconde
 */
public class Impresora {

 private String nombre;
 private String tipoHoja;
 private String texto;

 public String getNombre() {
  return nombre;
 }
 public void setNombre(String nombre) {
  this.nombre = nombre;
 }
 public String getTipoHoja() {
  return tipoHoja;
 }
 public void setTipoHoja(String tipoHoja) {
  this.tipoHoja = tipoHoja;
 }
 public String getTexto() {
  return texto;
 }
 public void setTexto(String texto) {
  this.texto = texto;
 }
}


FacadeCentral:

  1. package ar.com.patronesdisenio.facade.central;

    import ar.com.patronesdisenio.facade.impresora.Impresora;

    /**
     *
     * @author nconde
     *
     */
    public class FacadeCentral {

     private Impresora impresora;

     public void imprimir(String texto){
      impresora = new  Impresora();
      impresora.setNombre("NICO-Printer");
      impresora.setTipoHoja("A4");
      impresora.setTexto(texto);
     }

    }

 ClientMain:

  1. package ar.com.patronesdisenio.facade.cliente;
    import ar.com.patronesdisenio.facade.central.FacadeCentral;

    public class ClienteMain {

     /**
      * @param args
      */
     public static void main(String[] args) {

      FacadeCentral facadeCentral  = new FacadeCentral();
                    facadeCentral.imprimir("Texto a imprimir");
     }

    }

1 comentario:

  1. Casino - Miami - JTM Hub
    Casino - Miami - 제천 출장마사지 JTM Hub 광양 출장마사지 At 통영 출장안마 JTM, the world's largest award-winning 영천 출장안마 gaming, entertainment, dining 부천 출장안마 and nightlife venue, JTM offers

    ResponderEliminar