a schema definition
State Pattern: Allows to change the behavior of an object when its internal state changes, the object appears to change its class.
Two-mode example
1 Pattern Analysis
We use the case of document editing mode switching to illustrate this mode.
2 state pattern static class diagram
3 Code Examples
3.1 Create a state interface - IState
package com.demo.state; import com.demo.context.Context; /** * * Status interface * * @author * */ public interface IState { /** * state transition * * @param context * @param mode */ public void convertState(Context context, int mode); /** * preservation method * * @param context */ public void save(Context context); /** * Modification method * * @param context */ public void modify(Context context); /** * Added method * * @param context */ public void add(Context context); /** * View method * * @param context */ public void view(Context context); }
3.2 Create a context environment - Context
package com.demo.context; import com.demo.state.IState; /** * context * * @author * */ public class Context { // preview mode public static final int PREVIEW_MODE = 0; // edit mode public static final int EDIT_MODE = 1; // current state private IState state; // change state public void changeState(IState state) { this.state = state; } /** * run * * @param mode */ public void doWork(int mode) { System.out.println("-----------------"); this.state.convertState(this, mode); this.state.add(this); this.state.save(this); this.state.modify(this); this.state.view(this); System.out.println("-----------------"); } }
3.3 Edit State - EditState
package com.demo.state; import com.demo.context.Context; /** * Edit mode status * * @author * */ public class EditState implements IState { /** * state transition */ public void convertState(Context context, int mode) { if (mode == Context.PREVIEW_MODE) { context.changeState(new PreviewState()); } } /** * Edit mode added */ public void add(Context context) { System.out.println("Edit mode [New]..."); } /** * Edit mode modification */ public void modify(Context context) { System.out.println("Edit mode [modify]..."); } /** * Edit mode save */ public void save(Context context) { System.out.println("Edit mode [Save]..."); } /** * View in edit mode */ public void view(Context context) { System.out.println("Edit mode [View]..."); } }
3.4 Preview state - PreviewState
package com.demo.state; import com.demo.context.Context; /** * Preview mode status * * @author * */ public class PreviewState implements IState { /** * state transition */ public void convertState(Context context, int mode) { if (mode == Context.EDIT_MODE) { context.changeState(new EditState()); } } /** * Preview mode added */ public void add(Context context) { System.out.println("Preview mode does not support [New] function!"); } /** * Preview mode modification */ public void modify(Context context) { System.out.println("The preview mode does not support the [modify] function!"); } /** * Preview mode save */ public void save(Context context) { System.out.println("Preview mode does not support the [Save] function!"); } /** * View in preview mode */ public void view(Context context) { System.out.println("Preview mode [View]..."); } }
3.5 Client Test - Client
package com.demo; import java.util.Random; import com.demo.context.Context; import com.demo.state.EditState; /** * Client application * * @author * */ public class Client { /** * @param args */ public static void main(String[] args) { Context context = new Context(); context.changeState(new EditState()); Random random = new Random(); for (int i = 0; i < 5; i++) { int r = random.nextInt(2); System.out.println("Current mode: " + (r == 0 ? "Preview Mode" : (r == 1 ? "Edit Mode" : ""))); context.doWork(r); } } }
4 Running results
Current Mode: Edit Mode
-----------------
Edit Mode【New】...
Edit Mode [Save]...
Edit Mode [Modify]...
Edit Mode [View]...
-----------------
Current Mode: Edit Mode
-----------------
Edit Mode【New】...
Edit Mode [Save]...
Edit Mode [Modify]...
Edit Mode [View]...
-----------------
Current Mode: Preview Mode
-----------------
Preview mode does not support the [New] function!
Preview mode does not support the [Save] function!
Preview mode does not support the [Modify] function!
Preview Mode【View】...
-----------------
Current Mode: Preview Mode
-----------------
Preview mode does not support the [New] function!
Preview mode does not support the [Save] function!
Preview mode does not support the [Modify] function!
Preview Mode【View】...
-----------------
Current Mode: Edit Mode
-----------------
Edit Mode【New】...
Edit Mode [Save]...
Edit Mode [Modify]...
Edit Mode [View]...
-----------------
Three principles of pattern design
1 "Open - closed" principle
2 Single Responsibility Principle
Four use cases
1 An object's behavior is shaped by its state, and it must change its behavior at runtime according to the state.
2 An operation contains a large multi-branch structure, and these branches are determined by the state of the object.
Five-state pattern static class diagram