2011-12-27 16 views
6

Utilizando el ejemplo del decorador de café que se muestra en Wikipedia (http://en.wikipedia.org/wiki/Decorator_pattern) cómo alguien puede tener métodos que solo los decoradores tienen, por ejemplo, el decorador de leche podría tener un método llamado "fatContent". ¿Es esto posible con este tipo de patrón de diseño? Si no, ¿qué tipo de patrón podría usar para lograr esto?Decorador Patrón con métodos específicos de decorador en Java

+0

No conocía ese patrón de diseño. Honestamente, no me gusta. –

+0

@MartijnCourteaux El ejemplo del café de la wikipedia se extrajo del libro [Your Brain On Design Patterns] (http://headfirstlabs.com/books/hfdp/). Pero contiene solo una pequeña parte sin más explicaciones. Recomiendo esta conferencia para una visión completa del patrón. – Beccari

+1

@MartijnCourteaux Decorator ?! Es uno de los patrones más * útiles *, IMO. –

Respuesta

3

El patrón de decorador por definición no permite agregar métodos distintos a los definidos en la interfaz. En realidad, siempre puede agregar métodos a cualquier clase, pero una vez que estos métodos no están definidos en la interfaz de implementación, el cliente no puede llamarlos utilizando esta interfaz.

La solución simple a su problema es definir varias interfaces, p. Café y leche. Luego puede definir la clase Capuchino que implementa ambas interfaces y probablemente contenga 2 instancias: SimpleCofee y FoamedMilk. Pero esta solución se ve más como una combinación de Decorador y Fachada.

4

Los decoradores pueden tener cualquier cantidad de métodos específicos. Puede introducir una interfaz específica de decorador que los decoradores implementan además de implementar la interfaz decorada.

Sin embargo, alguien tiene que saber que existen métodos, por lo tanto el decorador tiene que llamar al método internamente, la persona que llama debe saber que usa un decorador en lugar del objeto decorado (puede probar usando instanceof) o usar reflejo para verifica esos métodos.

9

Usted podía, pero que había necesidad de conocer el tipo con el fin de realmente llamada al método (suponiendo que no hay reflexión, etc.) si no coincide con el tipo que está pasando alrededor.

Tipos determinan lo que se conoce en tiempo de compilación: si CoffeeDecorater no incluye una firma fatContent, nada de recibir un CoffeeDecoractor sabe que existe el método.

Podría crear una interfaz adicional, pero necesitaría saber que existía para poder verificarla (instanceof) o interrogar a la clase para buscar una firma específica (reflejo).

Java sabe que existe un método en tiempo de compilación o lo busca en tiempo de ejecución.

Cuestiones relacionadas