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.