¿Cuándo es necesario usar el patrón de decorador? Si es posible, dame un ejemplo del mundo real que sea adecuado para el patrón.¿Cuándo necesitamos un patrón de decorador?
Respuesta
Las secuencias en Java - las subclases de InputStream
y OutputStream
son ejemplos perfectos del patrón de decorador.
A modo de ejemplo, escribir un archivo en el disco:
File toWriteTo = new File("C:\\temp\\tempFile.txt");
OutputStream outputStream = new FileOutputStream(toWriteTo);
outputStream.write("Sample text".getBytes());
A continuación, en caso de necesitar alguna funcionalidad adicional en relación con la escritura en el disco:
File toWriteTo = new File("C:\\temp\\tempFile.txt");
OutputStream outputStream =
new GZIPOutputStream(new FileOutputStream(toWriteTo));
outputStream.write("Sample text".getBytes());
Simplemente "encadenar" los constructores, se puede crear formas bastante poderosas de escribir en el disco. La belleza de esta manera es que puede agregar implementaciones diferentes (en este ejemplo) OutputStream
más adelante. Además, cada implementación no sabe cómo funcionan los demás, todos trabajan con el mismo contrato. Esto también hace que probar cada implementación sea muy fácil de forma aislada.
Hay muchos ejemplos del "mundo real" donde se puede usar el patrón de decorador. De la parte superior de mi cabeza, algunos ejemplos:
- de lectura y escritura en el disco (arriba)
- construcción de elementos de interfaz de usuario, tales como la adición de barras de desplazamiento a áreas de texto, etc
Head First Design Patterns tiene algunos ejemplos más del "mundo real".Parece que O'Reilly tiene su capítulo de muestra, que está en Decorator Pattern, de forma gratuita; Google presentó este enlace: PDF
Sí, java.io es totalmente sobre Decorador. – duffymo
+1: precioso ejemplo :) – Juliet
+1 Aunque no considero el uso intensivo del patrón Decorator en java.io como 'hermoso'. Es una de las varias razones por las que el archivo io en Java es tan doloroso en el a **. – helpermethod
Echa un vistazo a la descripción de Fowler; da un ejemplo concreto relacionado con libros/videos y un decorador "prestatario", puede encontrarlo here.
De Banda de los Cuatro:
Un conjunto de herramientas de interfaz de usuario gráfica, por ejemplo, debería permitir añadir propiedades como las fronteras o comportamientos como desplazarse a cualquier componente de la interfaz de usuario.
...
El decorador se ajusta a la interfaz del componente que decora de manera que su presencia es transparente para los clientes del componente. El decorador envía solicitudes al componente y puede realizar acciones adicionales (como dibujar un borde) antes o después del reenvío. La transparencia le permite anidar decoradores recursivamente, lo que permite un número ilimitado de responsabilidades adicionales.
¿Los IU del mundo real usan este tipo de decorador? –
Si está familiarizado con el desarrollo de Swing en Java (junto con otros kits de herramientas GUI), verá que el patrón de decorador se usa mucho. Puede tener un constructor que tome un componente específico y luego le agregue funcionalidad.
Aquí está a good article that uses Swing as an example.
La intención de Decorator es:
Adjuntar responsabilidades adicionales a un objeto de forma dinámica. Los decoradores proporcionan una alternativa flexible a las subclases para ampliar la funcionalidad. [Vía La cabeza primero: Diseño Patrones]
El uso más intensivo de Decorator son GUI y clases de java.io. Hay un capítulo libre de La cabeza primero: Patrones de diseño sobre Decorator [link] que proporcionan algunos otros ejemplos:
vamos a volver a examinar el uso excesivo típica de la herencia y que va a aprender cómo decorar sus clases en tiempo de ejecución usando una forma de composición de objetos. ¿Por qué? Una vez que conozca las técnicas de decoración , podrá dar a su (u otra persona) objetos nuevos responsabilidades sin hacer ningún cambio de código a las clases subyacentes .
También puede leer Decorator por Ejemplo[PDF] en el que Decorator se utiliza en una aplicación de evaluación.
El primer enlace PDF de Head First es 404. –
@ james.garriss: fijo –
Pediste un ejemplo del mundo real, por lo que aquí tienes: descarga (o navegar) DonsProxy de GitHub:
git: //github.com/DonBranson/DonsProxy.git
DonsProxy básicamente utiliza un patrón WireTap para permitirle ver o extraer el tráfico HTTP, además le permite modificar el comportamiento de la conexión para simular conexiones sub óptimas. Uso el patrón Decorator para modificar los canales según las opciones del usuario. Las opciones de línea de comandos o GUI (dependiendo de qué vista están usando) permiten la inyección de latencia y la inyección de ancho de banda, entre otras cosas. Cuando inyectan latencia, eso agrega LatencyDecorator al canal; si estrangulan el ancho de banda, eso agrega ThrottleDecorator al canal. Dado que esto usa un patrón de decorador, pueden mezclar y combinar el comportamiento con el contenido de su corazón.
Uno de los usos más geniales (y más literales) que he visto es implementar la posibilidad de deshacer, en los malos tiempos de deshacer de un solo nivel. Dado un programa de dibujo vectorial, con varios objetos seleccionados, de diferentes colores: implemente un comando para cambiar todos sus colores. Y hazlo imposible de hacer. Esto se hizo aplicando un decorador, que se invocó en la secuencia getColor(), de modo que cuando se dibujaron, se dibujaron en el nuevo color; esencialmente los métodos getColor() propios del objeto fueron anulados. Entonces aparecieron en el nuevo color. Deshacer fue tan simple como eliminar el Decorador de todos los objetos; comprometer la acción era una cuestión de aplicar el color del Decorador a los objetos y luego quitarlo. Mucho más simple que mantener una mesa con los objetos pintados y sus colores originales.
Dos ejemplos de la vida real:
mejora de los sistemasel artículo en Diablo 2 y Final Fantasy 7. Las armas y armaduras tienen zócalos o ranuras. Durante el juego, el jugador puso actualizaciones (gemas, runas o materia) en esas máquinas tragamonedas.Cada actualización tiene un efecto individual (por ejemplo, 8 puntos de daño por fuego o 10% de maná). Entonces, cuando mueves tu espada, hace su daño base más el daño agregado por cada mejora que hayas agregado. Esto coincide con el patrón decorador extremadamente de cerca.
¿Está implementado con el patrón de decorador? Parece que una lista de estrategias funcionaría igual de bien. –
¿Cuándo es necesario utilizar el patrón de decorador?
Uso Decorator_pattern si
- responsabilidades y comportamientos objeto debe añadirse dinámicamente/eliminado
- implementaciones concretas deben ser desacoplados de responsabilidades y comportamientos
- subclases es demasiado costoso para añadir dinámicamente/eliminar responsabilidades
Si es posible, dame un ejemplo del mundo real que sea adecuado para el patrón.
He creado mi propio Decorador de máquina expendedora.
comunicado Problema: Calcular el precio de la bebida (té o café) mediante la adición de uno o más sabores como el azúcar, limón, etc
Ejemplo de código y la explicación está disponible @
- 1. ¿Cuándo necesitamos un patrón de adaptador?
- 2. Cuándo utilizar el patrón decorador?
- 3. ¿Por qué necesitamos el decorador en el patrón de diseño del decorador?
- 4. Patrón decorador en C++
- 5. ¿Cuándo necesitamos más de un EntityManager?
- 6. Implementación del patrón de decorador
- 7. APP y el patrón decorador
- 8. Decorador Patrón con métodos específicos de decorador en Java
- 9. Decorador Pregunta patrón C#/java
- 10. ¿Cuándo necesitamos usar [Browsable (true)]?
- 11. patrón de puente en comparación con el patrón de decorador
- 12. El patrón de decorador y @Inject
- 13. Implementando el patrón de decorador en Python
- 14. Patrón de decorador en Objective-C
- 15. StructureMap y el patrón de decorador
- 16. Patrón de diseño del generador: ¿por qué necesitamos un Director?
- 17. aplicar el patrón decorador a las formas
- 18. Cómo manejar 'este' referencia en decorador patrón
- 19. ¿Cuándo necesitamos usar float.PositiveInfinity y float.NegativeInfinity?
- 20. Decorar un decorador
- 21. Patrón de diseño de decorador, error de función
- 22. Patrón de repositorio: ¿por qué necesitamos interfaces exactamente?
- 23. el decorador del patrón y Métodos de extensión en C#
- 24. inyección de dependencias Ninject con el patrón decorador
- 25. ¿Todavía necesitamos el patrón de diseño del iterador?
- 26. Muy simple Uso del patrón de decorador para generar números
- 27. ¿Qué convención de nomenclatura usas para el Patrón Decorador?
- 28. cuándo utilizar el patrón abstracto de fábrica?
- 29. ¿Es este un decorador o un patrón de estrategia, o ninguno de los dos?
- 30. ¿Cuándo no necesitamos una clave principal para nuestra tabla?
Necesitas decirnos qué necesitas hacer si quieres saber si un patrón de decorador sería útil, si solo quieres un ejemplo general solo busca el Patrón Decorador en wikipedia. –
[Patrón de diseño del decorador] (http://www.singhajit.com/decorator-design-pattern/): indica cuándo necesitamos el patrón de diseño con el ejemplo de la vida real –