State pattern design

Transkrypt

State pattern design
State pattern design
1. Wprowadzenie:
State pattern(dosł. Wzorzec zachowania) jest wzorcem zachowania obiektu. Wzorzec używany jest
w programowaniu do reprezentowania stanu obiektu. Pozwala on w prosty sposób na częściową zmianę
stanu obiektu w trakcie życia instancji obiektu.
2. Wykorzystanie:
Załóżmy, że:
•
Obiekt znajduje się zawsze w jednym z wielu znanych stanów
•
Stan obiektu determinowany jest zachowaniem kilku metod
•
W każdej z tych metod można użyć wyrażeń warunkowych if/case
Wniosek : Najlepszym rozwiązaniem jest State Pattern !
Podczas modelowania systemów rzeczywistych możemy zauważyć, że pewne obiekty naszego systemu
dążą do zmiany swojego stanu w tracie działania programu. Na przykład:
•
Po zderzeniu się samochodów staja się one wrakami
•
Przyjaciel jest jednego dnia szczęśliwy innego przygnębiony
•
Po dodaniu elementu do pustej listy, przestaje być pusta
•
I wiele innych
Samochodem po zderzeniu nie można już jeździć, ale wrak nadal jest fundamentalnie tym samym
obiektem, tylko z innym zachowaniem. Przyjaciel pozostaje człowiekiem niezależnie od jego humoru.
3. Model logiczny:
Context - klasa, która może posiadać różne stany
State - definiuje wspólny interfejs dla wszystkich stanów, dzięki temu są wymienne.
ConcreteState - definiuje konkretną definicję stanu.
Działanie wzorca jest bardzo proste. Wywołując metodę Handle(), wykorzystywana jest odpowiednia
implementacja stanu.
Patrząc na powyższy diagram, można odnieść wrażenie, że definicja wzorca jest praktycznie taka sama
jak w przypadku wzorca Strategy. Jest jednak mała różnica między tymi dwoma wzorcami:
State Pattern:
•
zbiór zachować opakowanych klasami
•
w danym momencie klasa odnosi się do jednego z tych stanów
•
klient nie zna aktualnego (lub bardzo mało wie) stanu obiektu - nie definiuje go jawnie
Strategy Pattern:
•
klient sam definiuje obiekt strategii, który jest wykorzystywany w operacji
Możemy także podejść do tego od innej strony:
Mówiąc Strategy Pattern myślmy o zastępstwie dla dziedziczenia.
Mówiąc State Pattern myślmy o instrukcji if/switch w naszej klasie i wielu sprawdzanych warunkach.
4. Przykład:
Przykładem będzie reprezentacja zmiany nastroju człowieka:
Człowiek normalnie jest w koszmarnym humorze, uszczęśliwiamy go upajając go procentowymi
trunkami. Wysokość promili wyznacza nastrój człowieka