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 clases concreta implementando las misma interface.
public class Rectangle implements Shape {
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
@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();
}
}
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");
}
}
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.
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;
}
}
/**
* @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:
ClientMain:
Casino - Miami - JTM Hub
ResponderEliminarCasino - Miami - 제천 출장마사지 JTM Hub 광양 출장마사지 At 통영 출장안마 JTM, the world's largest award-winning 영천 출장안마 gaming, entertainment, dining 부천 출장안마 and nightlife venue, JTM offers