Decorator Pattern em Laravel: estendendo funcionalidades sem alterar o código original

Roberto Reis · 17/09/2025 - 10:50

O que é o Decorator Pattern?

O Decorator Pattern é um padrão estrutural que permite adicionar comportamentos ou responsabilidades a objetos de forma dinâmica, sem modificar sua classe base.

Isso é útil quando você quer estender funcionalidades sem criar heranças infinitas ou mexer no código original.

Exemplo prático em Laravel: sistema de notificação

Imagine que você tem um sistema de notificações.
No início, só enviava e-mails.
Agora, o time quer enviar também SMS e notificações no Slack.

Em vez de mudar a classe original, podemos usar o Decorator Pattern para adicionar esses novos comportamentos.

Implementando o Decorator Pattern

1. Criando a interface base

<?php

namespace App\Contracts;

interface Notifier
{
    public function send(string $message): void;
}

2. Criando o componente concreto

<?php

namespace App\Services;

use App\Contracts\Notifier;

class EmailNotifier implements Notifier
{
    public function send(string $message): void
    {
        \Log::info("📧 Enviando email: {$message}");
    }
}

3. Criando a classe base para os Decorators

<?php

namespace App\Services\Decorators;

use App\Contracts\Notifier;

abstract class NotifierDecorator implements Notifier
{
    public function __construct(
        protected Notifier $notifier
    ) {}
}

4. Criando os Decorators concretos

<?php

namespace App\Services\Decorators;

class SmsNotifier extends NotifierDecorator
{
    public function send(string $message): void
    {
        $this->notifier->send($message);
        \Log::info("📱 Enviando SMS: {$message}");
    }
}

class SlackNotifier extends NotifierDecorator
{
    public function send(string $message): void
    {
        $this->notifier->send($message);
        \Log::info("💬 Enviando Slack: {$message}");
    }
}

5. Usando no Controller

<?php

namespace App\Http\Controllers;

use App\Services\EmailNotifier;
use App\Services\Decorators\{SmsNotifier, SlackNotifier};
use Illuminate\Http\Request;

class NotificationController extends Controller
{
    public function enviar(Request $request)
    {
        $notifier = new EmailNotifier();

        // Adiciona dinamicamente novos canais
        $notifier = new SmsNotifier($notifier);
        $notifier = new SlackNotifier($notifier);

        $notifier->send("Novo pedido confirmado!");

        return response()->json(['status' => 'Notificações enviadas!']);
    }
}

Vantagens

  • 🎯 Adiciona funcionalidades sem alterar a classe original.
  • 🔄 Permite compor dinamicamente diferentes comportamentos.
  • 🧩 Evita herança múltipla e duplicação de código.

📚 Reflexão para o dia:

O Decorator nos mostra que podemos adicionar novas camadas de valor sem precisar mudar a essência. Na sua vida, que “decoradores” positivos você poderia acrescentar hoje para enriquecer sua atuação no mundo?