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

Converter campos de um banco de dados do tipo json para array com laravel

Converter campos de um banco de dados do tipo json para array com laravel

Hoje boa parte dos banco de dados relacionais podem armazenar campos com valores no formato JSON o que garante maior... Leia mais

Como iniciar, parar e reiniciar o Apache Web Server no Linux

Como iniciar, parar e reiniciar o Apache Web Server no Linux

Comandos  para controlar o funcionamento do apache em ambientes de desenvolvimento locais: Estes Comandos Servem para ambientes Ubuntu/Debian: Leia mais

Instalar o PGAdmin 4 em distribuições Linux Debian 12

Instalar o PGAdmin 4 em distribuições Linux Debian 12

Recentemente enquanto utilizava o Linux Mint 21 Vera tive uma série de problemas ao instalar o PGAdmin 4 e numa... Leia mais

Usando a Função ROW_NUMBER e Outras Funções para Gerar Resultados Sequenciais no PostgreSQL

Usando a Função ROW_NUMBER e Outras Funções para Gerar Resultados Sequenciais no PostgreSQL

Quando trabalhamos com bancos de dados, muitas vezes precisamos gerar números sequenciais para nossos resultados. Isso pode ser útil para... Leia mais