Patron de diseño estructural "decorator"
**Patrón de diseño estructural: Decorador**
El patrón de diseño Decorador es un patrón estructural que permite añadir responsabilidades adicionales a un objeto de forma dinámica. Esto se consigue envolviendo el objeto original en un objeto decorador que proporciona la funcionalidad adicional.
**Problema que resuelve**
El patrón Decorador resuelve el problema de añadir funcionalidades adicionales a un objeto de forma dinámica. Esto es útil en situaciones en las que:
* No es posible o práctico modificar el código del objeto original.
* Se desea añadir funcionalidades adicionales a un objeto sin tener que crear subclases.
* Se desea añadir funcionalidades adicionales a un objeto de forma incremental.
**Solución**
El patrón Decorador proporciona la siguiente solución:
* Define una interfaz para los objetos que pueden tener responsabilidades añadidas.
* Define un objeto al cual se le pueden agregar responsabilidades adicionales.
* Define una clase decoradora abstracta que proporciona una interfaz para los decoradores.
* Define clases decoradores concretas que implementan la funcionalidad adicional que se desea añadir.
**Ejemplo**
Consideremos el ejemplo de un objeto `Coche` que tiene la funcionalidad de conducir. Se desea añadir la funcionalidad de sonar la bocina al coche.
**Solución sin Decorador**
Una solución sin Decorador sería crear una subclas de `Coche` que implemente la funcionalidad de sonar la bocina.
```
class CocheConBocina(Coche):
def sonar_bocina(self):
print("Bocinazo!")
```
Esta solución es válida, pero tiene el inconveniente de que requiere modificar el código del objeto original.
**Solución con Decorador**
La solución con Decorador es crear una clase decoradora `Bocina` que envuelva al objeto `Coche` y proporcione la funcionalidad de sonar la bocina.
```
class Bocina(Decorador):
def __init__(self, coche):
self.coche = coche
def conducir(self):
self.coche.conducir()
self.sonar_bocina()
def sonar_bocina(self):
print("Bocinazo!")
```
Para utilizar esta solución, basta con crear un objeto `Coche` y envolverlo en un objeto `Bocina`.
```
coche = Coche()
coche_con_bocina = Bocina(coche)
coche_con_bocina.conducir()
```
Esta solución es más flexible que la solución sin Decorador, ya que permite añadir la funcionalidad de sonar la bocina sin tener que modificar el código del objeto original.
**Ventajas**
El patrón Decorador tiene las siguientes ventajas:
* Permite añadir funcionalidades adicionales a un objeto de forma dinámica.
* No requiere modificar el código del objeto original.
* Permite añadir funcionalidades adicionales a un objeto de forma incremental.
**Desventajas**
El patrón Decorador tiene las siguientes desventajas:
* Puede dificultar el seguimiento de la responsabilidad de los objetos.
* Puede aumentar la complejidad del código.
**Conclusión**
El patrón Decorador es un patrón de diseño útil para añadir funcionalidades adicionales a un objeto de forma dinámica. Es una buena opción cuando no es posible o práctico modificar el código del objeto original.
Comentarios
Publicar un comentario