2010-08-13 24 views
31

¿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?

+1

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. –

+0

[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 –

Respuesta

50

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

+3

Sí, java.io es totalmente sobre Decorador. – duffymo

+1

+1: precioso ejemplo :) – Juliet

+1

+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

5

Echa un vistazo a la descripción de Fowler; da un ejemplo concreto relacionado con libros/videos y un decorador "prestatario", puede encontrarlo here.

8

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.

+0

¿Los IU del mundo real usan este tipo de decorador? –

1

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.

3

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.

+0

El primer enlace PDF de Head First es 404. –

+0

@ james.garriss: fijo –

1

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.

3

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.

20

Dos ejemplos de la vida real:

mejora de los sistemas

el 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.

+0

¿Está implementado con el patrón de decorador? Parece que una lista de estrategias funcionaría igual de bien. –

0

¿Cuándo es necesario utilizar el patrón de decorador?

Uso Decorator_pattern si

  1. responsabilidades y comportamientos objeto debe añadirse dinámicamente/eliminado
  2. implementaciones concretas deben ser desacoplados de responsabilidades y comportamientos
  3. 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 @

When to Use the Decorator Pattern?

Cuestiones relacionadas