Sobes.tech
Middle

Como implementa o padrão de design 'Estratégia' em PHP?

sobes.tech IA

Resposta da IA

O padrão Estratégia permite encapsular diferentes algoritmos em classes separadas e torná-los intercambiáveis em tempo de execução. O código cliente trabalha com uma interface comum de estratégias, sem conhecer a sua implementação concreta.

A implementação em PHP inclui:

  1. Interface de Estratégia: Define um método comum que todas as estratégias concretas irão implementar.
  2. Estratégias concretas: Classes que implementam a interface e contêm a lógica específica do algoritmo.
  3. Contexto: Classe que contém uma referência a um objeto estratégia e delega a execução do método a esse objeto.

Exemplo:

// 1. Interface de Estratégia
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Estratégia concreta (ordenação bubble)
class BubbleSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        $n = count($data);
        for ($i = 0; $i < $n; $i++) {
            for ($j = 0; $j < $n - 1 - $i; $j++) {
                if ($data[$j] > $data[$j + 1]) {
                    $temp = $data[$j];
                    $data[$j] = $data[$j + 1];
                    $data[$j + 1] = $temp;
                }
            }
        }
        return $data;
    }
}

// 2. Estratégia concreta (ordenação rápida)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Implementação simples para exemplo, em código real seria recursivo
        sort($data); // Usamos função embutida para ilustrar
        return $data;
    }
}

// 3. Contexto
class SortedList
{
    private SortStrategy $strategy;
    private array $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function setSortStrategy(SortStrategy $strategy): void
    {
        $this->strategy = $strategy;
    }

    public function sort(): array
    {
        if (!isset($this->strategy)) {
            throw new \RuntimeException("Estratégia de ordenação não definida.");
        }
        return $this->strategy->sort($this->data);
    }
}

// Uso
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);

// Com ordenação bubble
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Com ordenação rápida
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Vantagens:

  • Flexibilidade: Adicionar novos algoritmos de ordenação sem alterar o contexto.
  • Extensibilidade: Novas estratégias podem ser implementadas de forma independente.
  • Clareza do código: O contexto é separado da lógica dos algoritmos específicos.
  • Testabilidade: Cada estratégia pode ser testada de forma isolada.