Stan (ang. State) (wzorzec behawioralny) definiuje rodzinę stanów jakie może przyjąć obiekt kontekstu w trakcie działania programu i na podstawie zmiany stanu obiektu kontekstu umożliwia zmianę jego zachowanie. Stany przypominają automat stanów, tzn. w zależności od bieżącego stanu podejmowana jest przez niego odpowiadająca mu akcja oraz może nastąpić zmiana stanu obiektu kontekstu. O tym czy stan obiektu kontekstu zostanie zmieniony decydują klasy stanu (w zależności od podjętej akcji znają one swojego następnika). Szczegóły implementacji podejmowanych akcji są ukryte dla klienta i delegowane do klas stanu. Dzięki czemu upraszcza się kod kontekstu, eliminuje instrukcje warunkowe oraz kod realizacji zadań w zależności od stanu jest organizowany w osobne klasy.
Ograniczenia
Wzorzec Stan jest strukturalnie podobny do wzorca Strategia. W związku z czym może zachodzić obawa o mylenie obu wzorców, które służą realizacji innych celów. W przypadku, gdy liczba stanów jest mała lub częstotliwośc zmiany stanu jest niska użycie wzorca pomimo słusznych przesłanek może być przerostem formy nad treścią.
Użycie
Wzorzec ten podobnie jak Adapter wykorzystuje mechanizm delegowania operacji do innego obiektu. Ponadto jego struktura jest podobna do struktury wzorca Strategia oraz Most. Jednakże celem wzorca Most jest zaprojektowanie odpowiedniej struktury klas projektu, Strategia skupia się na zmienności implementacji tych samych lub podobnych zadań, natomiast Stan realizuje zmienność zachowania obiektu w zależności od jego stanu wewnętrznego. Stan ma zastosowanie w sytuacjach, gdzie obiekt kontekstu może przyjmować różne stany w trakcie działania programu, a realizacja żądań jest zależna od stanu wewnętrznego obiektu.
Implementacja
Klasa kontekstu Context przechowuje referencję do obiektu bieżącego stanu (kontekstu) State. Metody kontekstu delegują wykonanie pracy do obiektu stanu, który wykonuje zadanie oraz zmienia referencję do obiektu stanu. Klasy stanów implementują interfejs State, którego metody są często powiązane z metodami o tej samej nazwie w klasie kontekstu. Ponadto klasa Context umożliwia zmianę oraz dostęp do stanu. Klasy stanów nierzadko są realizowane z użyciem Singletonu.
Poniższy listing prezentuje implementację wzorca Stan wykorzystywanego w klasie Context, która może przyjąć jeden ze stanów: State1, State2 lub State3.
Klient wykonuje operacje na obiekcie kontekstu przez co zmienia się także jego stan. W zależności od bieżącego stanu podjęta akcja na to samo żądanie może być realizowana w różny sposób.
Przykład
MusicPlayer jest odtwarzaczem muzyki, który oferuje podstawową funkcjonalność dla tego typu aplikacji. Użytkownik może stworzyć i odtwarzać własną playlistę lub wybrać playlistę na podstawie albumu bądź artysty. Utwory są odtwarzane wg kolejności z playlisty, a nawigacja między nimi oraz widok panelu użytkownika są zależne od stanu odtwarzania utworu. Poniższy listing przedstawia sposób realizacji nawigowania między utworami przy wykorzystaniu wzorca Stan dla stanów odtwarzane (PlayState) oraz wstrzymane (StopState).
Użytkownik tworzy własną playlistę, a następnie odtwarza, wstrzymuje oraz nawiguje się między utworami.
Biblioteki
Realizacja wzorca Stan spoczywa na programiście i polega na identyfikacji zbioru stanów dla obiektu kontekstu oraz implementacji zachowań klas stanów.