2013-01-21 4 views
11

Capisco che lo State pattern può essere utilizzato per modellare oggetti che modificano il comportamento in base allo stato e ai vari stati che può avere Context incapsulato in classi concrete che rappresentano un'interfaccia State. Quello che non sono chiaro è come le transizioni di stato avvengano in questo schema. L'individuo states conosce e decide chi li segue o è lo Context che decide quale stato otterrà in seguito?Chi definisce le transizioni di stato nel modello di stato?

risposta

9

dai modelli libro GOF Design (Questa è lì nella sezione implementazione):

1. Chi definisce le transizioni di stato? Il modello di stato non specifica quale partecipante definisce i criteri per le transizioni di stato. Se i criteri sono corretti, possono essere implementati interamente nel contesto. In genere è più flessibile e appropriato, tuttavia, lasciare che le sottoclassi dello Stato specifichino il loro stato successore e quando effettuare la transizione. Ciò richiede l'aggiunta di un'interfaccia al contesto che consenta agli oggetti Stato di impostare esplicitamente lo stato corrente del contesto.

Decentrare la logica di transizione in questo modo facilita la modifica o l'estensione della logica definendo nuove sottoclassi di stato. Uno svantaggio del decentramento è che una sottoclasse di stato avrà conoscenza di almeno un'altra, che introduce le dipendenze di implementazione tra sottoclassi.

4

Può essere un esempio relativamente concreto può chiarire. Spero di capirlo correttamente

Supponiamo che una lavatrice abbia due stati (ON, Off). A seguito di GoF vocabolario:

  • Context => lavatrice
  • Stato => WashingMachineState
  • stati calcestruzzo => StateOn, StateOff

Per transizione di stato, tramite sottoclassi di stato (nel nostro caso StateOn e StateOff) abbiamo bisogno di avere un metodo per cambiare stato Contesto:

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()) 
    } 
} 

Basta tenere in mente ci sono diversi modi per implementarlo, la creatività aiuta!