Treci la conținutul principal

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ă.)

Prompt
Scrie un script PHP cu șablonul State: o interfață State cu next și describe, clasele NewState, PaidState și ShippedState (starea shipped rămâne shipped) și o clasă Order care ține o stare, cu o metodă advance ce o înlocuiește. Parcurge o comandă prin toate cele trei stări, afișând fiecare descriere.
Ieșire: script PHP

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ă.