Middle
¿Qué es un decorador (Decorator) en el contexto de la programación y cómo se utiliza?
sobes.tech AI
Respuesta de la IA
El decorador es un patrón de diseño estructural que permite agregar dinámicamente un comportamiento o responsabilidades nuevas a los objetos sin modificar su estructura.
Ideas principales:
- Envuelve un objeto existente, ampliando su funcionalidad.
- Mantiene la interfaz del objeto envuelto, asegurando la intercambiabilidad.
- Evita la proliferación de jerarquías de clases al agregar nuevas combinaciones de comportamiento.
Uso:
- Ampliación de funcionalidad "en tiempo de ejecución": Se aplica cuando se necesita agregar o cambiar el comportamiento de un objeto durante la ejecución del programa.
- Alternativa a la herencia: En lugar de crear subclases para cada combinación de comportamientos, se utilizan decoradores. Es un enfoque más flexible.
- Combinación de comportamientos: Diferentes decoradores pueden aplicarse al mismo objeto en diferentes órdenes, creando combinaciones únicas.
Ejemplo en Python:
# Componente base
class Component:
def operation(self):
pass
# Componente concreto
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Decorador base (almacena una referencia al objeto envuelto)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Decorador concreto A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Decorador concreto B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Uso
simple = ConcreteComponent()
print(simple.operation()) # ConcreteComponent
decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)
decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
Ejemplo en Python como azúcar sintáctico @:
def my_decorator(func):
def wrapper():
print("Antes de la función")
func()
print("Después de la función")
return wrapper
@my_decorator
def say_hello():
print("¡Hola!")
say_hello()
# Salida:
# Antes de la función
# ¡Hola!
# Después de la función