Ce este
Șablonul State (Stare) oferă unui obiect comportament diferit în stări diferite, făcând din fiecare stare o clasă separată. Obiectul păstrează starea curentă și îi deleagă apelurile; trecerea într-o altă stare înseamnă înlocuirea obiectului de stare.
Înlocuiește instrucțiunea match ($status) { ... } care crește și se repetă în jumătate din metode cu o clasă mică pentru fiecare stare.
Exemplu: viața unei comenzi
O comandă este nouă, apoi plătită, apoi expediată. Fiecare clasă de stare răspunde la describe() în felul său și știe care stare urmează — comanda însăși nu conține nicio logică legată de status.
Fiecare stare este o clasă
advance() rămâne o singură linie pentru totdeauna. Adăugarea unei stări „delivered” înseamnă o clasă nouă plus un next() modificat — nu există niciun match de căutat. (Stările au sufixul State deoarece new este un cuvânt cheie și nu poate numi o clasă.)
Ieșire: script PHP
<?php
interface State {
public function next(): State;
public function describe(): string;
}
class NewState implements State {
public function next(): State { return new PaidState(); }
public function describe(): string { return "nouă - se așteaptă plata"; }
}
class PaidState implements State {
public function next(): State { return new ShippedState(); }
public function describe(): string { return "plătită - se împachetează cutia"; }
}
class ShippedState implements State {
public function next(): State { return $this; }
public function describe(): string { return "expediată - este pe drum"; }
}
class Order {
public function __construct(private State $state) {}
public function advance(): void {
$this->state = $this->state->next();
}
public function describe(): string {
return $this->state->describe();
}
}
$order = new Order(new NewState());
echo $order->describe(), "\n";
$order->advance();
echo $order->describe(), "\n";
$order->advance();
echo $order->describe(), "\n";
Când să îl folosești
Folosește-l când comportamentul unui obiect diferă într-adevăr de la o stare la alta și stările au reguli reale privind tranzițiile — comenzi, documente (ciornă/revizuire/publicat), conexiuni, personaje de joc.
Renunță la el când un status este doar afișat și nu schimbă niciodată comportamentul. O proprietate de tip șir de caractere și un singur match sunt suficiente sub trei stări cu reguli simple.
Avantaje și dezavantaje
Avantaje: regulile fiecărei stări se află într-o singură clasă mică; tranzițiile imposibile pur și simplu nu sunt scrise; stările noi extind codul în loc să îl modifice.
Dezavantaje: multe clase minuscule pentru automate simple; fluxul întregului automat este împrăștiat în mai multe fișiere — o diagramă într-un comentariu ajută.