Sobes.tech
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:

  1. 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.
  2. Alternativa a la herencia: En lugar de crear subclases para cada combinación de comportamientos, se utilizan decoradores. Es un enfoque más flexible.
  3. 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