Ce este
Șablonul Strategy face un algoritm interschimbabil: codul din jur rămâne același, iar partea care se schimbă — cum se calculează prețul, cum se sortează, cum se comprimă — este introdusă ca o valoare.
PHP face acest lucru ușor: închiderile (closures) sunt valori de prim rang, așa că o strategie este adesea doar un Closure aflat într-o proprietate. Nicio interfață, nicio clasă suplimentară — atribui o altă închidere și comportamentul se schimbă.
Exemplu: preț interschimbabil
checkout() nu se schimbă niciodată; regula de preț este o închidere aflată într-o proprietate. Preț obișnuit, Black Friday, reducere pentru membri — trei închideri, un singur magazin.
Strategia este o închidere
Trei calcule pentru același preț de 50 dau trei totaluri — diferă doar închiderea atribuită. Așa funcționează și usort: îi predai strategia de comparare.
Ieșire: script PHP
<?php
// În PHP, strategia este pur și simplu o închidere (closure).
class Shop {
public function __construct(public \Closure $pricing) {}
public function checkout(float $price): void {
printf("total: %.2f\n", ($this->pricing)($price));
}
}
$regular = fn(float $p): float => $p;
$blackFriday = fn(float $p): float => $p * 0.7;
$member = fn(float $p): float => $p - 5;
$shop = new Shop($regular);
$shop->checkout(50);
$shop->pricing = $blackFriday;
$shop->checkout(50);
$shop->pricing = $member;
$shop->checkout(50);
Când să îl folosești
Folosește-l ori de câte ori un algoritm variază, iar codul din jurul lui nu: reguli de preț, politici de reîncercare, ordini de sortare, moduri de validare.
Renunță la el când există un singur algoritm și niciun al doilea realist. Folosește o interfață cu clase în locul unei închideri doar atunci când o strategie are nevoie de propria stare sau de mai multe metode.
Avantaje și dezavantaje
Avantaje: comportamentul se schimbă la rulare; fiecare strategie este mică și se poate testa separat; în PHP costă aproape nimic — o închidere și o atribuire.
Dezavantaje: strategia aleasă este invizibilă la locul apelului — depanarea înseamnă să afli ce a fost atribuit; prea multe micro-strategii fragmentează o logică simplă.