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...
Código
public abstract class Bebida { public abstract double getPrecio(); protected Tamano size; public Tamano getSize(){ return size; } public void setSize(Tamano tamano){ this.size = tamano; } }
Código
public class Te extends Bebida { public Te(){ size = Tamano.normal; } public Te(Tamano tamano){ size = tamano; } return "Te " + size; } public double getPrecio() { return 8.25; } public Tamano getSize(){ return size; } public void setSize(Tamano tamano){ size = tamano; } }
Código
public abstract class DecoradorDeBedida extends Bebida{ protected Bebida bebida; }
Código
public class Leche extends DecoradorDeBedida{ public Leche(Bebida bebida, Tamano tamano){ this.bebida = bebida; size = tamano; } 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; } }
Código
public enum Tamano { grande,pequena,normal; }
Código
public class Sistema { Bebida bebida = new Te(Tamano.grande); bebida = new Leche(bebida, Tamano.grande); } }
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.
Código
public abstract class Bebida { public abstract double getPrecio(); }
Código
public class Te extends Bebida { return "Te "; } public double getPrecio() { return 8.25; } }
Código
public abstract class DecoradorDeBedida extends Bebida{ protected Bebida bebida; }
Código
public class Leche extends DecoradorDeBedida{ public Leche(Bebida bebida){ this.bebida = bebida; } return bebida.getDescripcion() + " con leche"; } public double getPrecio() { return bebida.getPrecio() + 7.25; } }
Código
public abstract class DecoradorDeTamano extends Bebida{ protected Bebida bebida; }
Código
public class Grande extends DecoradorDeTamano{ public Grande(Bebida bebida){ this.bebida = bebida; } return bebida.getDescripcion() + " grande"; } public double getPrecio(){ return bebida.getPrecio() * 0.50 + bebida.getPrecio(); } }
Código
public class Pequeña extends DecoradorDeTamano{ public Pequeña(Bebida bebida){ this.bebida = bebida; } 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?