2012-08-26 1550 views
6

¿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

4

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 "

+0

¡Maravillosa explicación! – goldfinger

0

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 Cates-aFeline, de hecho un Felinees-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.

0

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.

Cuestiones relacionadas