Sobes.tech
Middle

Come implementi il pattern di progettazione 'Strategia' in PHP?

sobes.tech AI

Risposta dell'AI

Il pattern Strategia consente di incapsulare diversi algoritmi in classi separate e di renderli intercambiabili durante l'esecuzione del programma. Il codice client lavora con un'interfaccia comune delle strategie, senza conoscere la loro implementazione concreta.

L'implementazione in PHP include:

  1. Interfaccia Strategia: Definisce un metodo comune che tutte le strategie concrete implementeranno.
  2. Strategie concrete: Classi che implementano l'interfaccia e contengono la logica specifica dell'algoritmo.
  3. Contesto: Classe che contiene un riferimento a un oggetto strategia e delega l'esecuzione del metodo a tale oggetto.

Esempio:

// 1. Interfaccia Strategia
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Strategia concreta (ordinamento a bolle)
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. Strategia concreta (ordinamento rapido)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Implementazione semplice per esempio, in codice reale sarebbe ricorsiva
        sort($data); // Utilizziamo funzione incorporata per illustrare
        return $data;
    }
}

// 3. Contesto
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("Strategia di ordinamento non impostata.");
        }
        return $this->strategy->sort($this->data);
    }
}

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

// Con ordinamento a bolle
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Con ordinamento rapido
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Vantaggi:

  • Flessibilità: È facile aggiungere nuovi algoritmi di ordinamento senza modificare il contesto.
  • Estendibilità: Nuove strategie possono essere implementate indipendentemente.
  • Pulizia del codice: Il contesto è separato dalla logica degli algoritmi specifici.
  • Testabilità: Ogni strategia può essere testata isolatamente.