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 o PostgreSQL 16 no Linux Mint 21

Como Instalar o PostgreSQL 16 no Linux Mint 21

O PostgreSQL 16 ainda não está disponível nos repositórios oficiais do Linux Mint 21, então usaremos o repositório oficial do... Leia mais

Como ignorar permissões do Linux em repositórios GIT.

Como ignorar permissões do Linux em repositórios GIT.

Recentemente me deparei com um problema curioso que ocorre no GIT principalmente enquanto escrevemos código em modo root e depois... Leia mais

A função WITH RECURSIVE no PostgreSQL

A função WITH RECURSIVE no PostgreSQL

A função WITH RECURSIVE no PostgreSQL é uma ferramenta poderosa para a execução de consultas recursivas em bancos de dados.... 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