PauloRB.dev

Desenvolvedor de Software

Padrão de Projeto Strategy: Flexibilidade e Eficiência no Design de Software com PHP | PauloRB.dev Padrão de Projeto Strategy: Flexibilidade e Eficiência no Design de Software com PHP – PauloRB.dev
Padrão de Projeto Strategy: Flexibilidade e Eficiência no Design de Software com PHP

Padrão de Projeto Strategy: Flexibilidade e Eficiência no Design de Software com PHP

Quando desenvolvemos software, é comum encontrar situações onde diferentes comportamentos precisam ser aplicados a objetos semelhantes. A abordagem tradicional de implementar todos esses comportamentos diretamente na classe pode tornar o código confuso e difícil de manter. É aí que entra o Padrão Strategy.

O que é o Padrão Strategy?

O Padrão Strategy é um padrão de design comportamental que permite definir uma família de algoritmos ou comportamentos, encapsulá-los em classes separadas e torná-los intercambiáveis. Com o Strategy, movemos a responsabilidade de decidir qual comportamento aplicar para fora da classe principal. Dessa forma, podemos modificar ou estender o comportamento sem alterar o código original da classe.

Exemplo Prático: O Comportamento de Pagamento em uma Loja Online

Imagine que estamos desenvolvendo um sistema de pagamento para uma loja online. O cliente pode escolher diferentes métodos de pagamento, como cartão de crédito, PayPal ou boleto. Em vez de implementar cada método de pagamento diretamente na classe Pedido, podemos aplicar o Padrão Strategy para gerenciar esses comportamentos.

Passo 1: Criando a Interface de Estratégia

Primeiro, criamos uma interface que todas as estratégias de pagamento irão implementar:

<?php

interface MetodoPagamento
{
    public function pagar(float $valor);
}

Passo 2: Criando as Estratégias Concretas

Agora, podemos criar diferentes estratégias para os métodos de pagamento:

<?php

class PagamentoCartaoCredito implements MetodoPagamento
{
    public function pagar(float $valor)
    {
        echo "Pagamento de R$ {$valor} realizado com cartão de crédito.\n";
    }
}

class PagamentoPayPal implements MetodoPagamento
{
    public function pagar(float $valor)
    {
        echo "Pagamento de R$ {$valor} realizado via PayPal.\n";
    }
}

class PagamentoBoleto implements MetodoPagamento
{
    public function pagar(float $valor)
    {
        echo "Pagamento de R$ {$valor} realizado via boleto bancário.\n";
    }
}

Cada uma dessas classes implementa a interface MetodoPagamento e possui sua própria lógica para processar o pagamento.

Passo 3: Integrando o Strategy na Classe Pedido

Agora, a classe Pedido pode aceitar qualquer estratégia de pagamento e delegar a responsabilidade de processar o pagamento para a estratégia escolhida:

<?php

class Pedido
{
    private $metodoPagamento;

    public function __construct(MetodoPagamento $metodoPagamento)
    {
        $this->metodoPagamento = $metodoPagamento;
    }

    public function processarPagamento(float $valor)
    {
        $this->metodoPagamento->pagar($valor);
    }
}

A classe Pedido é simples, e seu único trabalho é delegar o processo de pagamento para o método escolhido, mantendo o código mais limpo e flexível.

Passo 4: Utilizando o Padrão Strategy

Com as classes prontas, podemos criar um pedido e definir a estratégia de pagamento que desejamos usar:

<?php

// O cliente escolhe pagar com cartão de crédito
$pedido = new Pedido(new PagamentoCartaoCredito());
$pedido->processarPagamento(150.00);

// O cliente escolhe pagar via PayPal
$pedido = new Pedido(new PagamentoPayPal());
$pedido->processarPagamento(250.00);

// O cliente escolhe pagar com boleto
$pedido = new Pedido(new PagamentoBoleto());
$pedido->processarPagamento(300.00);

Cada vez que o cliente realiza uma compra, a classe Pedido delega o processo de pagamento para a estratégia correta, sem a necessidade de modificar o código da classe. Se um novo método de pagamento for adicionado, como Pix, basta criar uma nova estratégia sem alterar as classes existentes.

Vantagens do Strategy

  1. Facilidade de Extensão: Adicionar novos métodos de pagamento ou alterar os comportamentos existentes se torna simples. Basta criar novas classes de estratégia, sem mexer no código das outras classes.
  2. Código mais Limpo e Organizado: Ao separar as responsabilidades, o código fica mais fácil de ler e manter. Cada estratégia foca em uma única tarefa, mantendo o princípio da responsabilidade única.
  3. Reduz Condicionais Complexas: Em vez de utilizar condicionais como if/else ou switch, o Strategy permite selecionar o comportamento dinamicamente através de polimorfismo.

Quando Utilizar?

O Padrão Strategy é útil quando:

  • Você tem múltiplas variações de um comportamento (por exemplo, diferentes métodos de pagamento).
  • Precisa evitar grandes blocos de condicionais.
  • Deseja adicionar novos comportamentos sem modificar o código existente.

Conclusão

O Padrão Strategy é uma ótima solução quando queremos flexibilidade no comportamento dos objetos, especialmente quando esse comportamento pode variar ou evoluir ao longo do tempo. Ao aplicar esse padrão, mantemos nosso código organizado e fácil de estender. No contexto de desenvolvimento PHP, o Strategy pode ser extremamente útil para lidar com diferentes cenários onde algoritmos ou comportamentos precisam ser dinâmicos e intercambiáveis.

Mais Posts

Script para automatizar instalações de ferramentas em ambiente LINUX

Script para automatizar instalações de ferramentas em ambiente LINUX

Para agilizar as instalações das minhas ferramentas de desenvolvimento quando for necessário resolvi montar o seguinte script: Basta colocar o... Leia mais

Como Instalar e Usar o MailHog com Laravel para Testes de Email

Como Instalar e Usar o MailHog com Laravel para Testes de Email

No desenvolvimento de aplicações web, especialmente no Laravel, enviar emails é uma tarefa comum. Porém, testar o envio de emails... Leia mais

Como Atualizar Valores de Chaves em Campos JSON no PostgreSQL

Como Atualizar Valores de Chaves em Campos JSON no PostgreSQL

Atualizar valores em um campo JSON no PostgreSQL é uma operação comum ao trabalhar com dados semi-estruturados. Isso é especialmente... Leia mais

Como instalar o DBEAVEr via PPA no Ubuntu Linux e derivados.

Como instalar o DBEAVEr via PPA no Ubuntu Linux e derivados.

Vamos a mais um post HOW TO…. Abra o Terminal: Você pode fazer isso procurando por “Terminal” no menu de... Leia mais