Padrões de Projeto em PHP: técnicas avançadas com exemplos de código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course
```html

Padrões de Projeto em PHP: técnicas avançadas com exemplos de código

Padrões de projeto são soluções comprovadas para problemas típicos que surgem no desenvolvimento de software. Se você já domina os padrões básicos (Singleton, Factory, Observer), é hora de passar para o próximo nível. Neste artigo, vamos analisar quatro padrões comportamentais avançados em PHP: Strategy, Command, State e Chain of Responsibility. Você aprenderá como eles ajudam a escrever código flexível, sustentável e escalável.



1. Padrão Strategy (Estratégia)

O padrão Strategy permite definir uma família de algoritmos, encapsular cada um deles e torná-los intercambiáveis. Isso é especialmente útil quando você tem várias maneiras de executar a mesma tarefa e deseja alternar facilmente entre elas sem modificar a classe principal.



Quando usar:

  • Você tem várias opções de algoritmos que podem mudar durante a execução.
  • Você deseja evitar construções condicionais extensas (if-else ou switch).
  • Os algoritmos podem ser reutilizados em diferentes partes da aplicação.


Exemplo: sistema de cálculo de frete

Imagine que você tem uma loja virtual e o custo do frete depende da transportadora escolhida: Correios, DHL ou serviço de entrega local.



<?php

// Interface da estratégiainterface ShippingStrategy { public function calculate(float $weight, float $distance): float;}

// Estratégias concretasclass RussianPostShipping implements ShippingStrategy { public function calculate(float $weight, float $distance): float { return ($weight * 0.5) + ($distance * 0.1); }}

class DHLShipping implements ShippingStrategy { public function calculate(float $weight, float $distance): float { return ($weight * 1.2) + ($distance * 0.3) + 10; }}

class CourierShipping implements ShippingStrategy { public function calculate(float $weight, float $distance): float { return ($weight * 0.8) + ($distance * 0.2) + 5; }}

// Contextoclass Order { private float $weight; private float $distance; private ShippingStrategy $strategy;

public function __construct(float $weight, float $distance, ShippingStrategy $strategy) { $this->weight = $weight; $this->distance = $distance; $this->strategy = $strategy; }

public function setStrategy(ShippingStrategy $strategy): void { $this->strategy = $strategy; }

public function getShippingCost(): float { return $this->strategy->calculate($this->weight, $this->distance); }}

// Uso$order = new Order(2.5, 100, new RussianPostShipping());echo "Frete via Correios: " . $order->getShippingCost() . " RUB";

$order->setStrategy(new DHLShipping());echo "Frete via DHL: " . $order->getShippingCost() . " RUB";?>


Neste exemplo, alteramos facilmente o algoritmo de cálculo de custo sem modificar a classe Order. Adicionar uma nova transportadora se resume a criar uma nova classe que implementa a interface ShippingStrategy.



2. Padrão Command (Comando)

O padrão Command transforma solicitações em objetos, permitindo parametrizar clientes com diferentes solicitações, enfileirar solicitações, registrá-las ou suportar desfazer operações.



Quando usar:

  • Precisa implementar desfazer (undo) e refazer (redo) operações.
  • É necessário enfileirar operações ou executá-las de forma assíncrona.
  • Você deseja separar o remetente da solicitação do seu destinatário.


Exemplo: editor de texto com desfazer ações



<?php

// Interface do comandointerface Command { public function execute(): void; public function undo(): void;}

// Receptor (Receiver)class ```

Blogs

Book Recommendations