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

Entradas populares de este blog

Arquitectura Monolitica