Wzorzec Stan umożliwia zmianę zachowania obiektu, kiedy zmianie ulegnie jego wewnętrzny stan. Wzorzec ten jest bardzo użyteczny i występuje praktycznie wszędzie. Przykładem z życia może być np: przełącznik światła, który posiada dwa stany: włączony (ON) i wyłączony (OFF).

Dla przykładu zbudujemy taki minimalistyczny przełącznik 🙂

Pierwsza klasa stanu – State, jest abstrakcyjna i posiada również abstrakcyjną metodę change, która będzie zmieniać aktualny stan na inny (ale to dopiero w implementacji 😉 ). Metoda ta, poprzez typowanie przyjmuje instancję klasy Context.

Klasa Context – jest najważniejsza i pozwala na bieżąco śledzić stan obiektu:

Konstruktor pobiera obiekt stanu: State $object. Metoda setState ustawia aktualny stan obiektu, a getState zwraca go. Metoda Run – to tzw. „wyzwalacz” i zmienia stan (za pomocą metody change) z aktualnego na inny. W poniższych klasach „stanu” (On / Off) będzie to widoczne.

Klasa On:

Klasa Off:

Obie klasy zmieniają kontekst, ustawiając (w pamięci) przeciwne stany po wykonaniu operacji ON lub OFF:

Potrzebujemy jeszcze klasy klienta (Client), której użyjemy do zabawy przełącznikiem:

 

Przykład na GitHub →