状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了一个类
Class Diagram
 
Implementation
状态接口
| 12
 3
 4
 5
 
 | public abstract class State {protected String desc;
 public abstract void handle(Context context);
 public abstract void display();
 }
 
 | 
具体状态
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | public class ConcreteStateA extends State {
 {
 desc = "休息中";
 }
 
 @Override
 public void handle(Context context) {
 System.out.println("当前状态" + desc);
 System.out.println("状态处理,切换工作状态");
 context.setState(new ConcreteStateB());
 }
 
 @Override
 public void display() {
 System.out.println("状态:" + desc);
 }
 }
 
 public class ConcreteStateB extends State {
 
 {
 desc = "工作中";
 }
 
 @Override
 public void handle(Context context) {
 System.out.println("当前状态" + desc);
 System.out.println("状态处理,切换工作状态");
 context.setState(new ConcreteStateA());
 }
 
 @Override
 public void display() {
 System.out.println("状态:" + desc);
 }
 }
 
 | 
使用状态的实例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | public class Context {private State state;
 
 public Context(State state) {
 this.state = state;
 }
 
 public State getState() {
 return state;
 }
 
 public void setState(State state) {
 this.state = state;
 }
 
 public void request(){
 state.handle(this);
 }
 
 public void displayState(){
 state.display();
 }
 }
 
 | 
测试类
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | public class StateTest {@Test
 public void test() throws Exception {
 Context context = new Context(new ConcreteStateA());
 context.displayState();
 context.request();
 context.displayState();
 context.request();
 context.displayState();
 }
 }
 
 | 
Example
Reflence