State in Java
Why read if you can watch?
Watch State's video tutorialState design pattern - an FSM with two states and one event (distributed transition logic - logic in the derived state classes)
- Create a "wrapper" class that models the state machine
- The wrapper class maintains a "current" state object
- All client requests are simply delegated to the current state object and the wrapper object's "this" pointer is passed
- Create a state base class that makes the concrete states interchangeable
- The State base class specifies any useful "default" behavior
- The State derived classes only override the messages they need to o/r
- The State methods will change the "current" state in the "wrapper"
import java.io.*;
// Event - push
///// 1. The "wrapper" class ///// // State ----
class Button { // ON OFF
///// 2. The "current" state object ///// // OFF ON
private State current;
public Button() { current = OFF.instance(); }
public void setCurrent( State s ) { current = s; }
///// 3. The "wrapper" always delegates to the "wrappee" /////
public void push() { current.push( this ); }
}
///// 4. The "wrappee" hierarchy /////
class State {
public void push( Button b ) { // 5. Default behavior
b.setCurrent( OFF.instance() ); // can go in the base
System.out.println( " turning OFF" ); // class
} }
class ON extends State {
private static ON inst = new ON();
private ON() { }
public static State instance() { return inst; }
}
class OFF extends State {
private static OFF inst = new OFF();
private OFF() { }
public static State instance() { return inst; }
///// 6. Override only the necessary methods /////
public void push( Button b ) {
///// 7. The "wrappee" may callback to the "wrapper" /////
b.setCurrent( ON.instance() );
System.out.println( " turning ON" );
} }
public class StateToggle {
public static void main( String[] args ) throws IOException {
InputStreamReader is = new InputStreamReader( System.in );
int ch;
Button btn = new Button();
while (true) {
System.out.print( "Press 'Enter'" );
ch = is.read(); ch = is.read();
btn.push();
} } }
D:\Java> java StateToggle
Press 'Enter'
turning ON
Press 'Enter'
turning OFF
Press 'Enter'
turning ON
Press 'Enter'
turning OFF
