Estaba estudiando el patrón de decorador como se documenta en GOF .
Por favor, ayúdame a entender el Patrón Decorador . ¿Podría alguien dar un ejemplo de caso de uso de dónde esto es útil en el mundo real?
decorator
design-patterns
odiseh
fuente
fuente
Respuestas:
Considere un caso de una pizzería. En la pizzería venderán pocas variedades de pizza y también proporcionarán ingredientes en el menú. Ahora imagine una situación en la que la pizzería tiene que proporcionar precios para cada combinación de pizza y cobertura. Incluso si hay cuatro pizzas básicas y 8 coberturas diferentes, la aplicación se volvería loca manteniendo todas estas combinaciones concretas de pizzas y coberturas.
Aquí viene el patrón decorador.
Según el patrón del decorador, implementará coberturas como decoradores y las pizzas serán decoradas por los decoradores de esas coberturas. Prácticamente cada cliente querría ingredientes de su deseo y el monto final de la factura estará compuesto por las pizzas base y los ingredientes adicionales ordenados. Cada decorador de topping sabría acerca de las pizzas que está decorando y su precio. El método GetPrice () del objeto Topping devolvería el precio acumulado tanto de la pizza como del topping.
EDITAR
Aquí hay un ejemplo de código de explicación anterior.
fuente
Este es un ejemplo simple de agregar dinámicamente un nuevo comportamiento a un objeto existente, o el patrón Decorator. Debido a la naturaleza de los lenguajes dinámicos como Javascript, este patrón se convierte en parte del lenguaje en sí.
fuente
switch
o un simpleif
, podría afirmar que este es un gran ejemplo de agregar dinámicamente el comportamiento a una clase. PERO, necesitamos al menos dos clases para definir un decorador y objetos decorados en este patrón.Vale la pena señalar que el modelo de E / S de Java se basa en el patrón decorador. La colocación en capas de este lector encima de ese lector encima de ... es un ejemplo de decorador del mundo real.
fuente
Ejemplo: escenario: supongamos que está escribiendo un módulo de cifrado. Este cifrado puede cifrar el archivo sin cifrar utilizando DES - Estándar de cifrado de datos. Del mismo modo, en un sistema puede tener el cifrado como AES: estándar de cifrado avanzado. Además, puede tener la combinación de cifrado: primero DES, luego AES. O puede tener primero AES, luego DES.
Discusión: ¿Cómo atenderá esta situación? No puede seguir creando el objeto de tales combinaciones, por ejemplo, AES y DES, un total de 4 combinaciones. Por lo tanto, debe tener 4 objetos individuales. Esto se volverá complejo a medida que aumente el tipo de cifrado.
Solución: siga acumulando la pila, combinaciones según la necesidad, en tiempo de ejecución. Otra ventaja de este enfoque de pila es que puede desenrollarlo fácilmente.
Aquí está la solución: en C ++.
En primer lugar, necesita una clase base, una unidad fundamental de la pila. Puedes pensar como la base de la pila. En este ejemplo, es un archivo claro. Sigamos siempre el polimorfismo. Primero haga una clase de interfaz de esta unidad fundamental. De esta manera, puede implementarlo como desee. Además, no necesita pensar en la dependencia al incluir esta unidad fundamental.
Aquí está la clase de interfaz:
Ahora, implemente esta clase de interfaz:
Ahora, hagamos una clase abstracta de decorador, que se puede extender para crear cualquier tipo de sabores, aquí el sabor es el tipo de cifrado. Esta clase abstracta de decorador está relacionada con la clase base. Por lo tanto, el decorador "es un" tipo de clase de interfaz. Por lo tanto, debe usar la herencia.
Ahora, hagamos una clase de decorador concreto - Tipo de cifrado - AES -
Ahora, digamos que el tipo de decorador es DES -
const std :: string desEncrypt = "DES cifrado";
Hagamos un código de cliente para usar esta clase de decorador:
Verá los siguientes resultados:
Aquí está el diagrama UML - Representación de clase del mismo. En caso de que desee omitir el código y centrarse en el aspecto del diseño.
fuente
strategy pattern
?El patrón de decorador lo ayuda a cambiar o configurar una funcionalidad de su objeto al encadenarlo con otras subclases similares de este objeto.
El mejor ejemplo sería las clases InputStream y OutputStream en el paquete java.io
fuente
Qué es el patrón de diseño de decorador en Java.
La definición formal del patrón Decorator del libro GoF (Patrones de diseño: Elementos de software orientado a objetos reutilizables, 1995, Pearson Education, Inc. Publicación como Pearson Addison Wesley) dice que puede,
"Asigne responsabilidades adicionales a un objeto dinámicamente. Los decoradores proporcionan una alternativa flexible a la subclasificación para ampliar la funcionalidad".
Digamos que tenemos una pizza y queremos decorarla con ingredientes como pollo Masala, cebolla y queso mozzarella. Veamos cómo implementarlo en Java ...
Programa para demostrar cómo implementar Decorator Design Pattern en Java.
Pizza.java:
fuente
He usado el patrón Decorator ampliamente en mi trabajo. Hice una publicación en mi blog sobre cómo usarlo con el registro.
fuente
Tomemos un ejemplo en el que necesita crear una aplicación que calcule el precio de diferentes tipos de hamburguesas. Debe manejar diferentes variaciones de hamburguesas, como "grande" o "con queso", cada una de las cuales tiene un precio relativo a la hamburguesa básica. Por ejemplo, agregue $ 10 por hamburguesa con queso, agregue $ 15 adicionales por hamburguesa grande, etc.
En este caso, podría verse tentado a crear subclases para manejarlos. Podríamos expresar esto en Ruby como:
En el ejemplo anterior, la clase BurgerWithCheese hereda de Burger y anula el método de precio para agregar $ 15 al precio definido en la superclase. También crearía una clase LargeBurger y definiría el precio relativo a Burger. Pero también debe definir una nueva clase para la combinación de "grande" y "con queso".
¿Qué sucede si necesitamos servir "hamburguesa con papas fritas"? Ya tenemos 4 clases para manejar esas combinaciones, y necesitaremos agregar 4 más para manejar todas las combinaciones de las 3 propiedades: "grande", "con queso" y "con papas fritas". Necesitamos 8 clases ahora. Agregue otra propiedad y necesitaremos 16. Esto crecerá como 2 ^ n.
En su lugar, intentemos definir un BurgerDecorator que tome un objeto Burger:
En el ejemplo anterior, hemos creado una clase BurgerDecorator, de la cual hereda la clase BurgerWithCheese. También podemos representar la variación "grande" creando la clase LargeBurger. Ahora podríamos definir una hamburguesa grande con queso en tiempo de ejecución como:
¿Recuerda cómo usar la herencia para agregar la variación "con papas fritas" implicaría agregar 4 subclases más? Con los decoradores, solo crearíamos una nueva clase, BurgerWithFries, para manejar la nueva variación y manejar esto en tiempo de ejecución. Cada nueva propiedad necesitaría simplemente más decorador para cubrir todas las permutaciones.
PD. Esta es la versión corta de un artículo que escribí sobre el uso del Patrón Decorador en Ruby , que puede leer si desea obtener ejemplos más detallados.
fuente
Decorador:
Consulte la creación de fuentes artículo de para obtener más detalles.
Decorador (Resumen) : es una clase / interfaz abstracta, que implementa la interfaz del componente. Contiene interfaz de componentes. En ausencia de esta clase, necesita muchas subclases de ConcreteDecorators para diferentes combinaciones. La composición del componente reduce las subclases innecesarias.
Ejemplo de JDK:
Eche un vistazo a la siguiente pregunta SE para ver ejemplos de diagramas y códigos UML.
Patrón de decorador para IO
Artículos utiles:
journaldev
wikipedia
Ejemplo de palabra real del patrón Decorator: VendingMachineDecorator se ha explicado @
¿Cuándo usar el patrón decorador?
En el ejemplo anterior, el té o el café (bebida) ha sido decorado con azúcar y limón.
fuente
El patrón de decorador logra un único objetivo de agregar dinámicamente responsabilidades a cualquier objeto .
Java I / O Model se basa en el patrón decorador.
fuente
Hay un ejemplo en Wikipedia sobre la decoración de una ventana con barra de desplazamiento:
http://en.wikipedia.org/wiki/Decorator_pattern
Aquí hay otro ejemplo muy "real" de "miembro del equipo, líder del equipo y gerente", que ilustra que el patrón del decorador es insustituible con una herencia simple:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
fuente
Hace algún tiempo había refactorizado una base de código para usar el patrón Decorator, así que intentaré explicar el caso de uso.
Supongamos que tenemos un conjunto de servicios y, en función de si el usuario ha adquirido una licencia de un servicio en particular, necesitamos iniciar el servicio.
Todos los servicios tienen una interfaz común.
Pre Refactorización
Si observa con cuidado,
ServiceSupport
depende deLicenseManager
. Pero, ¿por qué debería ser dependienteLicenseManager
? ¿Qué sucede si necesitáramos un servicio en segundo plano que no necesita verificar la información de la licencia? En la situación actual tendremos que entrenar de alguna maneraLicenseManager
para volvertrue
a los servicios de fondo. Este enfoque no me pareció bien. Según mi verificación de licencia y otra lógica eran ortogonales entre sí.Entonces, Decorator Pattern viene al rescate y aquí comienza a refactorizar con TDD.
Post refactorización
Comida para llevar
fuente
Tomemos ejemplo de PubG. Los rifles de asalto funcionan mejor con un zoom de 4x y mientras estamos en él, también necesitaríamos compensador y supresor. Reducirá el retroceso y el sonido de disparo, así como el eco. Tendremos que implementar esta función donde permitiremos a los jugadores comprar su arma favorita y sus accesorios. Los jugadores pueden comprar el arma o algunos de los accesorios o todos los accesorios y se les cobrará en consecuencia.
Veamos cómo se aplica el patrón decorador aquí:
Supongamos que alguien quiere comprar SCAR-L con los tres accesorios mencionados anteriormente.
Esto llevará a un diagrama de clase como este:
Ahora, podemos tener clases como esta:
También podemos agregar otros accesorios y decorar nuestra pistola.
Referencia:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
fuente
Patrón de diseño de decorador : este patrón ayuda a modificar las características de un objeto en tiempo de ejecución. Proporciona diferentes sabores a un objeto y brinda flexibilidad para elegir qué ingredientes queremos usar en ese sabor.
Ejemplo de la vida real: Digamos que tiene un asiento de cabina principal en un vuelo. Ahora puede elegir múltiples comodidades con el asiento. Cada amenidad tiene su propio costo asociado. Ahora, si un usuario elige Wifi y comida premium, se le cobrará por asiento + wifi + comida premium.
En este caso, el patrón de diseño del decorador realmente puede ayudarnos. Visite el enlace anterior para comprender más sobre el patrón decorador y la implementación de un ejemplo de la vida real.
fuente