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 Configurar e Gerenciar um Banco de Dados MySQL com Docker Compose

Como Configurar e Gerenciar um Banco de Dados MySQL com Docker Compose

Configurar e gerenciar bancos de dados pode ser uma tarefa desafiadora, especialmente quando você precisa garantir a portabilidade e a... Leia mais

Laravel: Trabalhando com whereHas e with de forma simples

Laravel: Trabalhando com whereHas e with de forma simples

Quando trabalhamos com Eloquent no Laravel, frequentemente precisamos realizar consultas baseadas em relacionamentos entre modelos. Para isso, o Laravel oferece... Leia mais

Um resumo sobre o WSL2

Um resumo sobre o WSL2

O WSL 2 (Windows Subsystem for Linux) representa um grande avanço na integração entre o Windows e o Linux, permitindo... Leia mais

Jogo da Velha com HTML, CSS e JavaScript

Jogo da Velha com HTML, CSS e JavaScript

Vamos hoje desenvolver uma atividade que é comum em alguns testes de programação onde iremos desenvolver um simples jogo da... Leia mais