Sobes.tech
Middle

Comment implémentez-vous le patron de conception 'Stratégie' en PHP?

sobes.tech IA

Réponse de l'IA

Le patron Stratégie permet d'encapsuler différents algorithmes dans des classes séparées et de les rendre interchangeables à l'exécution. Le code client travaille avec une interface commune de stratégies, sans connaître leur implémentation concrète.

L'implémentation en PHP inclut :

  1. Interface de Stratégie : Définit une méthode commune que toutes les stratégies concrètes implémenteront.
  2. Stratégies concrètes : Classes qui implémentent l'interface et contiennent la logique spécifique de l'algorithme.
  3. Contexte : Classe qui contient une référence à un objet stratégie et délègue l'exécution de la méthode à cet objet.

Exemple :

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

// 2. Stratégie concrète (tri à bulles)
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. Stratégie concrète (tri rapide)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Implémentation simple pour l'exemple, en code réel serait récursive
        sort($data); // Utilise la fonction intégrée pour illustrer
        return $data;
    }
}

// 3. Contexte
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("Stratégie de tri non définie.");
        }
        return $this->strategy->sort($this->data);
    }
}

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

// Avec tri à bulles
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Avec tri rapide
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Avantages :

  • Flexibilité : Ajouter de nouveaux algorithmes de tri sans modifier le contexte.
  • Extensibilité : De nouvelles stratégies peuvent être implémentées indépendamment.
  • Clarté du code : Le contexte est séparé de la logique des algorithmes spécifiques.
  • Testabilité : Chaque stratégie peut être testée isolément.