Sobes.tech
Middle

O que é um decorador (Decorator)?

sobes.tech IA

Resposta da IA

O decorador é um padrão de design estrutural que permite adicionar funcionalidades adicionais a um objeto de forma dinâmica, sem alterar a sua estrutura. Ele envolve o objeto, fornecendo a mesma interface que o objeto envolvido, ao mesmo tempo que adiciona ou modifica o seu comportamento.

Elementos principais:

  • Componente (Component): Interface ou classe abstrata que define a funcionalidade comum para objetos envoltos e decoradores.
  • Componente Concreto (Concrete Component): Implementação do componente, objeto base ao qual uma funcionalidade é adicionada.
  • Decorador (Decorator): Classe abstrata que implementa a interface do componente e contém uma referência a um objeto componente.
  • Decorador Concreto (Concrete Decorator): Implementação do decorador que adiciona funcionalidade específica antes ou depois de chamar o método do objeto envolvido.

Exemplo em Python:

# Componente
class Coffee:
    def get_cost(self):
        return 5 # Custo base do café
    
    def get_description(self):
        return "Café simples"

# 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 # Adiciona o custo do leite

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

# Uso
# simple_coffee = SimpleCoffee()
# print(f"Custo: {simple_coffee.get_cost()}, Descrição: {simple_coffee.get_description()}")

# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Custo: {coffee_with_milk.get_cost()}, Descrição: {coffee_with_milk.get_description()}")

Vantagens:

  • Flexibilidade: Funcionalidade adicionada em tempo de execução.
  • Evitar subclasses: Permite evitar a criação de múltiplas subclasses para cada combinação de comportamentos.
  • Separação de responsabilidades: Cada adição de comportamento é feita em uma classe separada.

Desvantagens:

  • Pode aumentar o número de classes.
  • A depuração pode ficar mais difícil devido à cadeia de envoltórios.