PATRONES 101 - DECORATOR
La necesidad de investigar sobre este patrón se presenta cuando necesitas agregar funcionalidades adicionales u otras características a la clase sin complicar el código o la lógica en sí, la mejor manera de explicarlo es con un ejemplo:
Imaginen una cafetería que posee varias bebidas, por cada bebida hay un precio específico y el cliente puede agregar complementos a la bebida que no son exclusivos de la misma y que por consiguiente agregan un monto adicional al precio final y una nueva descripción a la Bebida en cuestión, como:"Mocachino, Canela, Suspiro, Fresas, $45.00" por decir algo
Partiendo de esto tenemos las siguientes entidades y sus tipos:
Bebidas:
- Batida
- Expreso
- Descafeinado
- Mocachino
- Jugo Natural
Complementos:
- Cada servicio puede contener: Leche de Soja, Soja, Crema, Frutas y mas...
Veamos el código en Java:
// Clase Abstracta que define la estructura base de la Bebida
public abstract class Bebida {
String descripcion = "Bebida sin definir";
public String getDescripcion() {
return descripcion;
}
public abstract double precio();
}
// Ahora la clase que representa una Bebida en concreto
public class Batida extends Bebida {
public Batida() {
descripcion = "Batida";
}
public double precio() {
return 45;
}
}
// Veamos otra Bebida
public class Mocachino extends Bebida {
public Mocachino() {
descripcion = "Mocachino";
}
public double precio() {
return 35;
}
// Antes de crear los complementos de las Bebidas debemos
// crear la clase que DECORA a los objetos Bebida con los
// complementos que luego seran agregados
public abstract class DecoradorComplementos extends Bebida {
public abstract String getDescripcion();
}
// Como ya tenemos la clase que DECORA a los objetos procedemos
// a crear los complementos
public class Leche extends DecoradorComplementos {
Bebida bebida;
// Se necesita una instancia de la clase bebida para decorar
public Leche(Bebida bebida) {
this.bebida = bebida;
}
public String getDescripcion() {
return bebida.getDescripcion() + ", Leche";
}
public double precio() {
return 10 + bebida.precio();
}
}
// Finalmente la implementacion (Uso) de estas clases seria
public class Cafeteria {
public static void main(String[] args) {
Bebida cafeMocachino = new Mocachino();
Bebida batidaEspecial = new Batida();
// Despachemos el Cafe Mocachino sin complemento
System.out.println(cafeMocachino.getDescripcion() + " " + cafeMocachino.precio());
// Ahora la batida con un complemento
// Le pasamos la instancia de la bebida al complemento
batidaEspecial = new Leche(batidaEspecial);
System.out.println(batidaEspecial.getDescripcion() + " " + batidaEspecial.precio());
}
}
// El resultado de esta ejecucion seria:Mocachino $35
Batida, Leche $55
En lo adelante para Nuevas Bebidas y Complementos la implementacion mas sencilla y rapida debido a esta forma de distribuir las responsabilidades.
Hasta la próxima...
Comentarios
Publicar un comentario