Sobes.tech
Middle

¿Qué es un decorador (Decorator)?

sobes.tech AI

Respuesta de la IA

El decorador es un patrón de diseño estructural que permite agregar funcionalidad adicional a un objeto de manera dinámica, sin modificar su estructura. Envuelve el objeto, proporcionando la misma interfaz que el objeto envuelto, pero añadiendo o modificando su comportamiento.

Elementos principales:

  • Componente (Component): Interfaz o clase abstracta que define la funcionalidad común para los objetos envueltos y decoradores.
  • Componente Concreto (Concrete Component): Implementación del componente, objeto base al que se añade funcionalidad.
  • Decorador (Decorator): Clase abstracta que implementa la interfaz del componente y contiene una referencia a un objeto componente.
  • Decorador Concreto (Concrete Decorator): Implementación del decorador que añade funcionalidad específica antes o después de llamar al método del objeto envuelto.

Ejemplo en Python:

# Componente
class Coffee:
    def get_cost(self):
        return 5 # Costo base del café
    
    def get_description(self):
        return "Café simple"

# Componente Concreto
class SimpleCoffee(Coffee):
    pass

# Decorador
class CoffeeDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def get_cost(self):
        return self._coffee.get_cost()

    def get_description(self):
        return self._coffee.get_description()

# Decorador Concreto
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Añade el costo de la leche

    def get_description(self):
        return self._coffee.get_description() + ", Leche"

# Uso
# simple_coffee = SimpleCoffee()
# print(f"Costo: {simple_coffee.get_cost()}, Descripción: {simple_coffee.get_description()}")

# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Costo: {coffee_with_milk.get_cost()}, Descripción: {coffee_with_milk.get_description()}")

Ventajas:

  • Flexibilidad: La funcionalidad se añade en tiempo de ejecución.
  • Evita subclases: Permite evitar crear muchas subclases para cada combinación de comportamientos.
  • Separación de responsabilidades: Cada adición de comportamiento se realiza en una clase separada.

Desventajas:

  • Puede aumentar el número de clases.
  • La depuración puede ser más difícil debido a la cadena de envoltorios.