Rozumiem, że model State pattern
może być używany do modelowania obiektów, które zmieniają zachowanie w zależności od stanu i różnych stanów, które może mieć Context
, jest hermetyzowany w konkretnych klasach, które reprezentują interfejs State
. Nie jest jasne, w jaki sposób przebiega stan w tym wzorze. Czy jednostka states
zna i decyduje, kto podąża za nią, czy też jest to Context
, która decyduje o tym, który stan będzie następny?Kto definiuje przejścia stanu w schemacie stanu?
Odpowiedz
od wzorów książki GOF Design (To tam w dziale realizacji):
1. Kto określa przejścia stanu? Wzorzec stanu nie określa, który uczestnik definiuje kryteria przejść między stanami. Jeśli kryteria zostaną ustalone, wówczas można je całkowicie wdrożyć w kontekście. Zasadniczo bardziej elastyczne i odpowiednie jest jednak pozwolenie państwom podklasowym na samodzielne określanie ich stanu następczego i czas przejścia. Wymaga to dodania interfejsu do kontekstu, który pozwala obiektom stanu jawnie ustawić bieżący stan kontekstu.
Decentralizacja logiki przejścia w ten sposób ułatwia modyfikowanie lub rozszerzanie logiki poprzez definiowanie nowych podklas stanu. Wadą decentralizacji jest to, że jedna podklasa państwowa będzie posiadać wiedzę co najmniej jednego innego, co wprowadza zależności implementacyjne między podklasami.
Może to być względny konkretny przykład, który można wyjaśnić. Mam nadzieję, że rozumiem to poprawnie.
Załóżmy, że pralka ma dwa stany (WŁ., WYŁ.). W następstwie GoF słownictwo:
- context => washingmachine State
- => WashingMachineState
- stany betonowe => StateOn, StateOff
Na przejściu państwowego, poprzez podklasy państwowych (w naszym przypadku StateOn i StateOff) potrzebujemy metody zmiany stanu Kontekst:
class WashingMachine {
WashingMachineState state;
...
protected void setState(WashingMachineState newState) {
state = newState;
}
someMethod() {
...
state.pushStartButton(this);
...
}
}
abstract class WashingMachineState {
protected void run();
protected void pushStartButton(WashingMachine wm);
}
class StateOn extends WashingMachineState {
...
void pushStartButton(WashingMachine wm) {
wm.setState(new StateOff())
}
}
class StateOff extends WashingMachineState {
...
void pushStartButton(WashingMachine wm) {
wm.setState(new StateOn())
}
}
Po prostu na myśli istnieje kilka sposobów na jego wdrożenie, pomaga kreatywność!
- 1. Jak rejestrować przejścia stanu w statnie (biblioteka maszyn stanu .NET)
- 2. AASM: Przejścia z dowolnego stanu?
- 3. Zmiana przejścia SubView po zmianie stanu
- 4. Zapisywanie stanu stanu Primefaces
- 5. Rysowanie diagramów stanu UML
- 6. Jak zaktualizować styl paska stanu w ramach niestandardowego przejścia
- 7. Ui-router: Jak uzyskać kolejne parametry stanu w czasie przejścia
- 8. Projektowanie maszyny stanu w C++
- 9. Różne czasy przejścia css3 dla stanu "do" i "powrotu"
- 10. Zachowanie stanu i kontenera stanu iOS
- 11. Tworzenie skrótów stanu od nazw stanu
- 12. Najlepsza praktyka przechodzenia ze stanu zagnieżdżonego do stanu zagnieżdżonego (zobacz diagram)
- 13. Monada stanu - funkcje adaptacyjne, które działają tylko z częściami stanu?
- 14. Utrzymywanie złożonego stanu w Haskell
- 15. Używanie opisu stanu w HttpUnauthorizedResult
- 16. Wykrywanie stanu połączenia w iOS4
- 17. Trwa kod stanu HTTP?
- 18. Wyświetlony pasek stanu Excela?
- 19. Utrzymywanie stanu widoku repetera
- 20. IllegalArgumentException: Niepoprawna klasa stanu
- 21. Wykrywanie stanu zasilania USB
- 22. UITableView Zakłócanie pasku stanu
- 23. Analizowanie kodu stanu HTTP
- 24. Ukrywanie/pokazywanie paska stanu
- 25. Response.Redirect kod stanu HTTP
- 26. JQuery - reset stanu przełączania
- 27. Dokumentacja paska stanu Emacsa
- 28. 502 kod stanu HTTP
- 29. Generator maszyn stanu C++
- 30. Zakleszczenie zmiennej stanu