elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ejercicio del patrón Decorador del libro Head First Design Patterns
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio del patrón Decorador del libro Head First Design Patterns  (Leído 2,031 veces)
Aikanáro Anário


Desconectado Desconectado

Mensajes: 694



Ver Perfil WWW
Ejercicio del patrón Decorador del libro Head First Design Patterns
« 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?


« Última modificación: 16 Febrero 2012, 22:33 pm por Aikanáro Anário » En línea

Lo que faltaba en internet: http://binar10s.blogspot.com/
sapito169


Desconectado Desconectado

Mensajes: 591



Ver Perfil
Re: Ejercicio del patrón Decorador del libro Head First Design Patterns
« Respuesta #1 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



En línea

Aikanáro Anário


Desconectado Desconectado

Mensajes: 694



Ver Perfil WWW
Re: Ejercicio del patrón Decorador del libro Head First Design Patterns
« Respuesta #2 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.
En línea

Lo que faltaba en internet: http://binar10s.blogspot.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Brushes y patterns
Diseño Gráfico
surfo 0 1,061 Último mensaje 23 Septiembre 2004, 20:51 pm
por surfo
Ejercicio conteo de lineas de libro "El lenguaje programación C" (Solucionado)
Programación C/C++
frogstalon 2 3,311 Último mensaje 23 Agosto 2011, 05:22 am
por frogstalon
¿Me echáis una mano con este ejercicio de un libro?
Redes
OmarHack 0 1,173 Último mensaje 4 Marzo 2013, 13:21 pm
por OmarHack
Encontré un CMS para foros responsive design
Desarrollo Web
manudg 0 1,012 Último mensaje 16 Julio 2013, 22:46 pm
por manudg
¿Páginas actualizadas para descargar libros? Busco Patterns Design de Gamma
Foro Libre
n-utz 5 4,189 Último mensaje 18 Julio 2017, 04:10 am
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines