¿Puede alguien explicarme las diferencias entre (como en los beneficios de) crear clases de decorador usando la inyección de constructor de otra clase en oposición a la herencia de clase? En los ejemplos en los que puedo pensar, podría lograr el mismo objetivo final de una de dos maneras, pero sospecho que me estoy perdiendo algo fundamental.decoración mediante inyección de constructor vs. herencia simple
Respuesta
El patrón de decorador se refiere a componiendo un objeto. Para poder heredar el tipo de ese objeto, obviamente debe ser heredable. No todos los tipos están diseñados para herencia, es decir, están destinados a ser clases base, incluso si desde un punto de vista puramente técnico pueden heredarse (que considero un error de diseño).
La razón de ser del patrón de decorador es poder modificar el comportamiento de los objetos sin modificar los objetos mismos. Al heredar, esencialmente estás modificando el objeto en sí y lo que obtienes es un cambio de comportamiento regular a través del polimorfismo, lo que significa que no hizo lo mismo.
Por lo tanto, la decoración y la herencia tiene sus aplicaciones. Utilice la decoración cuando cualquiera de éstos es cierto
- no se puede heredar (por ejemplo, si la clase es
sealed
en C#) - no debería heredar (la clase, obviamente, no está destinado a ser una clase base)
- que desea cambiar el comportamiento de un objeto particular, muchas veces (envolviéndolo con decoradores de comportamiento diferente)
Nota que la herencia es la herramienta más poderosa que existe en la caja de herramientas OO. Con gran poder viene una gran responsabilidad y eso no siempre es fácil de manejar. Yo diría: siempre componer o agregar. Cuando eso simplemente no se puede hacer, herede. Si no se puede heredar, esforzarse más para componer o agregado "
Me gustaría reanudar la siguiente manera:.?
¿Cuándo se debe heredar
Cuando los objetos son de la misma jerarquía semántica y representan una relación es-un.
¿Qué significa eso?
Que un Cat
es-aFeline
, de hecho un Feline
es-aVertebrate
, y así sucesivamente.
¿Cuándo se debe decorar?
Cuando los objetos no representan una relación es-a. Pero sí, tanto Coffee
como Milk
pueden estar en la misma jerarquía. Pero si were to sell Cappuccino
no diría que un café es una leche, en su lugar la decoraría con Milk
.
Conclusión:
Is-a es diferente de has-a. Uno es un subtipo, el otro es parte de una composición.
embargo, ver esto: https://stackoverflow.com/questions/1621344/head-first-design-patterns-decorator-pattern
Un ejemplo del mundo real sería la creación de un security container as a Decorator para sus controladores o servicios con el fin de realizar comprobaciones de ACL.
Otra razón realmente buena para decorar es que le da la opción de decorar una interfaz en lugar de una clase. A continuación, se unirá de forma bastante flexible y puede agregar el comportamiento de decoración ortogonal a múltiples implementaciones de la interfaz sin escribir más código.
- 1. Unity [dependencia] inyección y Herencia
- 2. texto-decoración: subrayado vs fondo de borde
- 3. Mejora de la herencia de JavaScript simple
- 4. Inyección de constructor usando Guice
- 5. Copiar herencia del constructor
- 6. Constructor predeterminado y herencia virtual
- 7. Herencia de Constructor de Java
- 8. Inyección de constructor: ¿a dónde llamar?
- 9. Herencia vs agregación
- 10. Inyección de constructor con otros argumentos de constructor, sin dependencia
- 11. Alternativas de inyección de constructor (Castle Windsor)
- 12. C++ Plantilla vs Herencia
- 13. Inyección de constructor Ninject en WPF
- 14. Inyección de constructor: ¿también inyectamos fábricas?
- 15. Inyección de constructor: ¿Cuántas dependencias hay demasiadas?
- 16. Inyección de constructor en C#/Unidad?
- 17. Constructor Vs Decorator
- 18. ¿Inyección de dependencia mediante constructores o definidores de propiedad?
- 19. Mixin vs herencia
- 20. Orden de constructor en la herencia virtual
- 21. Problema de herencia de plantilla simple C++
- 22. Herencia de Java vs polimorfismo
- 23. Ejemplo simple de herencia C++, ¿qué ocurre?
- 24. C# Instance Constructor vs Static Constructor
- 25. Delphi Dependency Injection: Framework vs Delegating Constructor
- 26. Inyección de constructor de primavera del registrador SLF4J: ¿cómo obtener la clase de destino de inyección?
- 27. Uso de inyección de propiedad en lugar de inyección de constructor
- 28. herencia simple mesa con embeds_one mogoid
- 29. Demasiadas matrices de constructores para el patrón de diseño de inyección/herencia de dependencias
- 30. Constructor inyección de dependencias en un controlador de ASP.NET MVC
¡Maravillosa explicación! – goldfinger