Stan to behawioralny wzorzec projektowy pozwalający zmieniać zachowanie obiektu w odpowiedzi na zmianę jego wewnętrznego stanu.
Wzorzec Stan zakłada ekstrakcję zachowań odnoszących się do stanu obiektu do osobnych klas odpowiadających jego poszczególnym stanom. Pierwotny obiekt wówczas deleguje pracę instancjom tych klas, zamiast wykonywać ją samodzielnie.
Zastosujmy wzorzec projektowy Stan w kontekście automatu do sprzedaży. Upraszczając, załóżmy że maszyna zawiera tylko jeden typ produktu i że może znajdować się w jednym z czterech stanów:
hasItem (maProdukt)
noItem (brakProduktu)
itemRequested (zażądanoProdukt)
hasMoney (maPieniądze)
Maszyna do sprzedaży będzie też w stanie wykonywać różne czynności. Znów upraszczając, zredukujmy ich liczbę do czterech:
Wybór produktu
Dodanie produktu
Przyjęcie pieniędzy
Wydanie produktu
Wzorzec projektowy Stan powinien być stosowany gdy obiekt może znajdować się w różnych stanach, a przejścia między nimi odbywają się na podstawie otrzymanego żądania.
W naszym przykładzie automat do sprzedaży może znajdować się w którymś ze stanów pomiędzy którymi będzie się ciągle przełączać. Powiedzmy, że maszyna jest w stanie ItemRequested. Jak tylko wykonana zostanie czynność “przyjęcie pieniędzy” maszyna przejdzie w stan hasMoney.
Zależnie od bieżącego stanu maszyna może zachowywać się w różny sposób w odpowiedzi na te same żądania. Przykładowo, jeśli użytkownik chce zakupić przedmiot, maszyna przejdzie dalej jeśli jest w stanie hasItemState lub odmówi działania jeśli jest w stanie noItemState.
Kod automatu do sprzedaży nie ulega zaśmieceniu tą logiką, gdyż znajduje się ona wyłącznie w odpowiednich implementacjach stanów.