patterns pattern example español design-patterns decorator

design-patterns - español - composite pattern example



¿Cuándo necesitamos un patrón de decorador? (9)

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

Use Decorator_pattern si

  1. Las responsabilidades y comportamientos del objeto se deben agregar / eliminar dinámicamente
  2. Implementaciones concretas deben estar desacopladas de las responsabilidades y comportamientos
  3. la creación de subclases es demasiado costosa para agregar / eliminar dinámicamente responsabilidades

Si es posible, dame un ejemplo del mundo real que sea adecuado para el patrón.

He creado mi propio Decorador de máquinas expendedoras.

Declaración del problema: Calcule el precio de la bebida (té o café) agregando uno o más sabores como azúcar, limón, etc.

El ejemplo del código y la explicación están disponibles @

Cuándo usar el patrón decorador?

¿Cuándo es necesario usar el patrón decorador? Si es posible, dame un ejemplo del mundo real que sea adecuado para el patrón.


De la pandilla de los cuatro:

Un juego de herramientas de interfaz gráfica de usuario, por ejemplo, debería permitirle agregar propiedades como bordes o comportamientos como desplazarse a cualquier componente de interfaz de usuario.

...

El decorador se ajusta a la interfaz del componente que decora para que su presencia sea 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.


Dos ejemplos de la vida real:

Los sistemas de actualización de ítems en Diablo 2 y Final Fantasy 7. Las armas y las armaduras tienen enchufes 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.


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


La intención del patrón Decorator es:

Adjunte responsabilidades adicionales a un objeto dinámicamente. Los decoradores proporcionan una alternativa flexible a las subclases para ampliar la funcionalidad. [a través de Head First: Patrones de diseño ]

El uso más pesado del patrón de decorador son las GUI y las clases java.io. Hay un capítulo gratuito de Head First: Patrones de diseño sobre patrón de decorador [link] que proporcionan algunos otros ejemplos:

Volveremos a examinar el uso excesivo típico de la herencia y aprenderá a decorar sus clases en tiempo de ejecución utilizando una forma de composición de objetos. ¿Por qué? Una vez que conozca las técnicas de decoración, podrá darle a su (u otra persona) nuevas responsabilidades sin hacer ningún cambio de código en las clases subyacentes.

También puede leer Patrón de decorador por ejemplo [PDF] en el que se usa el patrón de decorador en una aplicación de evaluación.


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í hay un buen artículo que usa Swing como ejemplo .


Uno de los usos más geniales -y más literales- que he visto fue 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.


DonsProxy un ejemplo del mundo real, así que aquí tienes: descarga (o navega) DonsProxy desde 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.


Las secuencias en Java: subclases de InputStream y OutputStream son ejemplos perfectos del patrón de decorador.

Como 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());

Entonces, si necesita alguna funcionalidad adicional con respecto a 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 "encadenando" los constructores, 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 del decorador. Fuera de mi cabeza, algunos ejemplos:
  • Lectura y escritura en el disco (arriba)
  • Construcción de elementos de IU, como agregar 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 mostró este enlace: PDF