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

Como instalar a Linguagem ELIXIR no Linux.

Como instalar a Linguagem ELIXIR no Linux.

Elixir é uma linguagem de programação dinâmica e funcional, desenvolvida por José Valim em 2011, projetada para construir aplicações escaláveis... Leia mais

Como Redimensionar Imagens Base64 com JavaScript e TypeScript

Como Redimensionar Imagens Base64 com JavaScript e TypeScript

Ao trabalhar com imagens base64 no front-end, é comum precisar redimensioná-las para melhorar o desempenho da aplicação, especialmente ao enviá-las... Leia mais

Formas de Paginação de Dados no Laravel

Formas de Paginação de Dados no Laravel

No desenvolvimento de aplicações web, a paginação de dados é um recurso fundamental quando se trabalha com grandes volumes de... Leia mais

Como acessar o entity Manager(Doctrine) dentro de comandos no Symfony 5

Como acessar o entity Manager(Doctrine) dentro de comandos no Symfony 5

Ao termos de criar comandos personalizados no Symfony na maioria das vezes se faz necessário o uso de alguma interação... Leia mais