- ¿Qué es el patrón Decorador?
- Caso práctico: comentarios en un blog
- ¿Puedo encadenar decoradores?
- Ventajas y desventajas del patrón Decorador
A menudo necesitamos agregar funcionalidades a un objeto sin modificar su estructura interna. Por ejemplo, si ya tenemos una clase que representa un comentario en un blog, podríamos querer agregarle filtros, auditoría o traducción automática.
Modificar la clase directamente podría generar problemas y romper lo que ya funciona. La solución es el patrón de diseño*Decorador*, que permite extender la funcionalidad de un objeto sin alterarlo.
¿Qué es el patrón Decorador?
Caso práctico: comentarios en un blog
Vamos a imaginar que estamos desarrollando el sistema de comentarios de un blog. 🎯 Nuestra meta: filtrar ciertos comentarios inadecuados, pero sin cambiar el código base de la clase que los maneja.
Aquí te explicamos paso a paso cómo hacerlo:
1. Creamos la clase básica Comment
Este será nuestro objeto original. Solo mostrará el texto de un comentario.
class Comment:
def __init__(self, text):
self.text = text
def display(self):
return self.text
✅ Hasta aquí solo tenemos lo básico: una clase con un método display() que devuelve el texto. No hay ningún filtro ni modificación.
2. Agregamos un decorador para filtrar groserías
Vamos a crear un decorador llamado ProfanityFilterDecorator. Esta clase va a envolver el comentario original y reemplazar las groserías por asteriscos (***), sin cambiar el texto original del Comment.
class ProfanityFilterDecorator:
def __init__(self, comment):
self.comment = comment
self.profanities = {"badword1", "badword2"} # lista de palabras no deseadas
def display(self):
# Obtener el texto del comentario original
words = self.comment.display().split()
# Si la palabra está en la lista, la reemplazamos con ***
result_words = [word if word not in self.profanities else "***" for word in words]
return " ".join(result_words)
Usamos una lista para simular palabras "prohibidas" y reemplazamos cualquier coincidencia por ***.
3. Usamos el decorador en la práctica
Probemos cómo funciona en código real:
# Creamos un comentario normal
comment = Comment("This is a comment with a badword1")
# Mostramos el comentario sin filtro
print(comment.display())
# Resultado: This is a comment with a badword1
# Aplicamos el decorador
filtered_comment = ProfanityFilterDecorator(comment)
# Mostramos el comentario con filtro
print(filtered_comment.display())
# Resultado: This is a comment with a ***
Fíjate que filtered_comment se comporta igual que un Comment, pero ahora tiene un comportamiento adicional. Eso es precisamente lo que hace el patrón Decorador.
¿Puedo encadenar decoradores?
¡Claro! Puedes tener múltiples decoradores uno encima del otro.
Por ejemplo, podrías crear otro decorador que traduzca el comentario. Y luego usarlo así:
comment = Comment("This is a comment with a badword1")
filtered = ProfanityFilterDecorator(comment)
translated = TranslationDecorator(filtered) # suponiendo que existe este decorador
Esto es súper útil cuando queremos agregar funcionalidades de manera modular, reutilizable y sin tocar el código original.
Ventajas y desventajas del patrón Decorador
| Ventajas | Desventajas |
|---|---|
| Permite agregar funcionalidades sin modificar código existente | Muchos decoradores pueden hacer el código difícil de seguir |
| Reutilizable y flexible | El comportamiento puede volverse "oculto" |
| Sigue principios SOLID |
Resumen
- El patrón Decorador permite añadir funcionalidad a objetos sin modificar su estructura. Se logra envolviendo un objeto dentro de otro, que comparte el mismo interfaz
- Es útil para mantener el código limpio y seguir los principios de diseño como SOLID.
- En Python, los decoradores se pueden implementar como clases o funciones.
- Los decoradores se pueden encadenar para ampliar el comportamiento de forma modular.
- Hay que tener cuidado de no abusar de ellos, o el código será difícil de entender.
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.