El problema original es usar el patrón Decorador para "decorar" bebidas (café, té), por ejemplo con canela, azucar o leche, solo eso. Esa parte del ejercicio se hace y se explica en el libro, pero después hay una continuación del mismo ejercicio en que piden que ahora el precio y la descripción varíe de acuerdo al tamaño de la bebida y el condimiento.
O sea, en la primera parte del ejercicio si pedíamos un Café (cuesta 10.50) con Leche (cuesa 3.25). Al imprimir salía:
"Tú bebida es un café con leche
Cuesta: 13.75"
Ahora debe tomar en cuenta el precio y salir algo como esto:
"Tú bebida es café grande con leche grande
Cuesta: 28.05"
Yo lo he hecho de dos formas diferentes, no sé cual está bien...
public abstract class Bebida {
public abstract String getDescripcion
(); public abstract double getPrecio();
protected Tamano size;
public Tamano getSize(){
return size;
}
public void setSize(Tamano tamano){
this.size = tamano;
}
}
public class Te extends Bebida {
public Te(){
size = Tamano.normal;
}
public Te(Tamano tamano){
size = tamano;
}
public String getDescripcion
() { return "Te " + size;
}
public double getPrecio() {
return 8.25;
}
public Tamano getSize(){
return size;
}
public void setSize(Tamano tamano){
size = tamano;
}
}
public abstract class DecoradorDeBedida extends Bebida{
protected Bebida bebida;
}
public class Leche extends DecoradorDeBedida{
public Leche(Bebida bebida, Tamano tamano){
this.bebida = bebida;
size = tamano;
}
public String getDescripcion
() { return bebida.getDescripcion() + " con leche " +size;
}
public double getPrecio() {
if(size == Tamano.grande)
return bebida.getPrecio() + 13.25;
if(size == Tamano.normal)
return bebida.getPrecio() + 7.25;
else
return bebida.getPrecio() + 3.25;
}
}
public enum Tamano {
grande,pequena,normal;
}
public class Sistema {
public static void main
(String[] args
) { Bebida bebida = new Te(Tamano.grande);
bebida = new Leche(bebida, Tamano.grande);
System.
out.
println("La bebida es: " + bebida.
getDescripcion()); System.
out.
println("Cuesta: " + bebida.
getPrecio()); }
}
Esa es la primera forma que usa una un enum y determina con condiciones si el condimiento/bebida es grande, normal o pequeña y le pone un precio según el tamaño.
El otro intento es un decorador, pero en vez de "decorar" las bebidas con condimientos, lo hago con el tamaño. Según sea el tamaño le resto o sumo el 50% de lo que vale la bebida. Si es tamaño normal, no le aumento ni rebajo nada.
public abstract class Bebida {
public abstract String getDescripcion
(); public abstract double getPrecio();
}
public class Te extends Bebida {
public String getDescripcion
() { return "Te ";
}
public double getPrecio() {
return 8.25;
}
}
public abstract class DecoradorDeBedida extends Bebida{
protected Bebida bebida;
}
public class Leche extends DecoradorDeBedida{
public Leche(Bebida bebida){
this.bebida = bebida;
}
public String getDescripcion
() { return bebida.getDescripcion() + " con leche";
}
public double getPrecio() {
return bebida.getPrecio() + 7.25;
}
}
public abstract class DecoradorDeTamano extends Bebida{
protected Bebida bebida;
}
public class Grande extends DecoradorDeTamano{
public Grande(Bebida bebida){
this.bebida = bebida;
}
public String getDescripcion
(){ return bebida.getDescripcion() + " grande";
}
public double getPrecio(){
return bebida.getPrecio() * 0.50 + bebida.getPrecio();
}
}
public class Pequeña extends DecoradorDeTamano{
public Pequeña(Bebida bebida){
this.bebida = bebida;
}
public String getDescripcion
(){ return bebida.getDescripcion() + " pequeño/a";
}
public double getPrecio(){
return bebida.getPrecio() * 0.50 - bebida.getPrecio();
}
}
¿Creen que alguno de las dos implementaciones esté correcta? ¿Cuál? ¿Cuál es mejor diseño?