2013-01-21 21 views
11

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

9

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.

4

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ść!