Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Aikanáro Anário en 16 Febrero 2012, 21:22 pm



Título: Ejercicio del patrón Decorador del libro Head First Design Patterns
Publicado por: Aikanáro Anário en 16 Febrero 2012, 21:22 pm
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...
Código
  1. public abstract class Bebida {
  2.  
  3. public abstract String getDescripcion();
  4. public abstract double getPrecio();
  5.  
  6. protected Tamano size;
  7.  
  8. public Tamano getSize(){
  9. return size;
  10. }
  11.  
  12. public void setSize(Tamano tamano){
  13. this.size = tamano;
  14. }
  15. }
  16.  

Código
  1. public class Te extends Bebida {
  2.  
  3. public Te(){
  4. size = Tamano.normal;
  5. }
  6.  
  7. public Te(Tamano tamano){
  8. size = tamano;
  9. }
  10.  
  11. public String getDescripcion() {
  12. return "Te " + size;
  13. }
  14.  
  15. public double getPrecio() {
  16. return 8.25;
  17. }
  18.  
  19. public Tamano getSize(){
  20. return size;
  21. }
  22.  
  23. public void setSize(Tamano tamano){
  24. size = tamano;
  25. }
  26. }
  27.  

Código
  1. public abstract class DecoradorDeBedida extends Bebida{
  2. protected Bebida bebida;
  3.  
  4. }
  5.  

Código
  1. public class Leche extends DecoradorDeBedida{
  2.  
  3. public Leche(Bebida bebida, Tamano tamano){
  4. this.bebida = bebida;
  5. size = tamano;
  6. }
  7.  
  8. public String getDescripcion() {
  9. return bebida.getDescripcion() + " con leche " +size;
  10. }
  11.  
  12. public double getPrecio() {
  13. if(size == Tamano.grande)
  14. return bebida.getPrecio() + 13.25;
  15. if(size == Tamano.normal)
  16. return bebida.getPrecio() + 7.25;
  17. else
  18. return bebida.getPrecio() + 3.25;
  19. }
  20.  
  21. }
  22.  

Código
  1. public enum Tamano {
  2. grande,pequena,normal;
  3. }
  4.  

Código
  1. public class Sistema {
  2. public static void main(String[] args) {
  3. Bebida bebida = new Te(Tamano.grande);
  4. bebida = new Leche(bebida, Tamano.grande);
  5. System.out.println("La bebida es: " + bebida.getDescripcion());
  6. System.out.println("Cuesta: " + bebida.getPrecio());
  7. }
  8. }
  9.  

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
  1.  
  2.  
  3. public abstract class Bebida {
  4.  
  5. public abstract String getDescripcion();
  6. public abstract double getPrecio();
  7. }
  8.  

Código
  1.  
  2. public class Te extends Bebida {
  3.  
  4. public String getDescripcion() {
  5. return "Te ";
  6. }
  7.  
  8. public double getPrecio() {
  9. return 8.25;
  10. }
  11.  
  12. }
  13.  

Código
  1.  
  2. public abstract class DecoradorDeBedida extends Bebida{
  3. protected Bebida bebida;
  4.  
  5. }
  6.  


Código
  1.  
  2. public class Leche extends DecoradorDeBedida{
  3.  
  4. public Leche(Bebida bebida){
  5. this.bebida = bebida;
  6. }
  7.  
  8. public String getDescripcion() {
  9. return bebida.getDescripcion() + " con leche";
  10. }
  11.  
  12. public double getPrecio() {
  13. return bebida.getPrecio() + 7.25;
  14. }
  15.  
  16. }
  17.  

Código
  1.  
  2. public abstract class DecoradorDeTamano extends Bebida{
  3. protected Bebida bebida;
  4.  
  5. }
  6.  

Código
  1.  
  2. public class Grande extends DecoradorDeTamano{
  3.  
  4. public Grande(Bebida bebida){
  5. this.bebida = bebida;
  6. }
  7.  
  8. public String getDescripcion(){
  9. return bebida.getDescripcion() + " grande";
  10. }
  11.  
  12. public double getPrecio(){
  13. return bebida.getPrecio() * 0.50 + bebida.getPrecio();
  14. }
  15. }
  16.  

Código
  1.  
  2. public class Pequeña extends DecoradorDeTamano{
  3.  
  4. public Pequeña(Bebida bebida){
  5. this.bebida = bebida;
  6. }
  7.  
  8. public String getDescripcion(){
  9. return bebida.getDescripcion() + " pequeño/a";
  10. }
  11.  
  12. public double getPrecio(){
  13. return bebida.getPrecio() * 0.50 - bebida.getPrecio();
  14. }
  15.  
  16. }
  17.  

¿Creen que alguno de las dos implementaciones esté correcta? ¿Cuál? ¿Cuál es mejor diseño?


Título: Re: Ejercicio del patrón Decorador del libro Head First Design Patterns
Publicado por: sapito169 en 17 Febrero 2012, 00:43 am
desventajas de la primera

poliformismo vs if esto atrae trolls alguien dijo "java mato a los punteros ahora el poliformismo mata a los if"  >:D ahora es momento de considerar if a modo de switch depreceted

si tu permites if enves de poliformismo se ve facil pero recuerda esos if se reproducen como un virus como si fueran una enfermedad se exparsen como el cancer es decir en el metodo getPrecio pones if luego agregas otro metodo (que necesite saber que tamaño tiene) pues facil copias y pegas la gigantesca lista de if y si denuevo quiero y si luego aparce otro pues facil copias y pegas nuebamente asi asta artarte

i que pasa cuando quieres agregar otro tamaño uuu te fregaste tendrias que buscar todos los if (imaginate que son 50 veces) en todas partes y agregar el nuebo tamaño
recuerda que tendrias que hacerlo a mano y que pasa si cuando copias y pegas creas un bug pues lo copiaste 50 veces



Título: Re: Ejercicio del patrón Decorador del libro Head First Design Patterns
Publicado por: Aikanáro Anário en 17 Febrero 2012, 02:44 am
Pues de hecho, he revisado la solución del libro (qué no sabía que la tenía) y así es como está: con if.

No es que los if sean malos. Todo depende de la situación.