Status Mode - Document Edit Mode Switch

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



 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326609439&siteId=291194637