Como vimos, nuestros diseños anteriores que usaban herencia no funcionaron tan bien. En este artículo, se analiza el patrón del decorador para el problema de diseño del conjunto anterior.
Entonces, lo que hacemos ahora es tomar una pizza y «decorarla» con ingredientes en tiempo de ejecución:
- Tome un objeto de pizza.
- “Decóralo” con un objeto Capsicum.
- “Decóralo” con un objeto CheeseBurst.
- Llame a getCost() y use la delegación en lugar de la herencia para calcular el costo de los ingredientes.
Lo que obtenemos al final es una pizza con toppings de cheeseburst y capsicum. Visualice los objetos «decoradores» como envoltorios. Estas son algunas de las propiedades de los decoradores:
- Los decoradores tienen el mismo supertipo que el objeto que decoran.
- Puede utilizar varios decoradores para envolver un objeto.
- Dado que los decoradores tienen el mismo tipo que el objeto, podemos pasar el objeto decorado en lugar del original.
- Podemos decorar objetos en tiempo de ejecución.
Definición:
El patrón decorador adjunta dinámicamente responsabilidades adicionales a un objeto. Los decoradores proporcionan una alternativa flexible a la subclasificación para ampliar la funcionalidad.
Diagrama de clase: origen de la imagen: Wikipedia
- Cada componente se puede usar solo o puede ser envuelto por un decorador.
- Cada decorador tiene una variable de instancia que contiene la referencia al componente que decora (relación HAS-A).
- El ConcreteComponent es el objeto que vamos a decorar dinámicamente.
ventajas:
- El patrón decorador se puede utilizar para hacer posible extender (decorar) la funcionalidad de un determinado objeto en tiempo de ejecución .
- El patrón decorador es una alternativa a la subclasificación. La creación de subclases agrega comportamiento en tiempo de compilación y el cambio afecta a todas las instancias de la clase original; La decoración puede proporcionar un nuevo comportamiento en tiempo de ejecución para objetos individuales.
- Decorator ofrece un enfoque de pago por uso para agregar responsabilidades. En lugar de tratar de admitir todas las funciones previsibles en una clase compleja y personalizable, puede definir una clase simple y agregar funcionalidad de forma incremental con objetos Decorator.
Desventajas:
- Los decoradores pueden complicar el proceso de creación de instancias del componente porque no solo tiene que crear una instancia del componente, sino también envolverlo en varios decoradores.
- Puede ser complicado hacer que los decoradores realicen un seguimiento de otros decoradores, porque mirar hacia atrás en múltiples capas de la string de decoradores comienza a empujar el patrón del decorador más allá de su verdadera intención.
Referencias:
- Patrones de diseño Head First (libro)
- https://neillmorgan.wordpress.com/2010/02/07/decorator-pattern-pros-and-cons/
- https://en.wikipedia.org/wiki/Decorator_pattern
- http://stackoverflow.com/questions/4842978/decorator-pattern-versus-sub-classing
En la próxima publicación, discutiremos la implementación del patrón decorador.
Este artículo es una contribución de Sulabh Kumar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo electrónico a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA