图片来自head first 设计模式,仅供学习之用
每个状态都直接映射成一个类,每个类都实现state接口,state接口中含有可能发生的所有动作。
状态机需要持有每一个状态的实例,并且要有一个状态变量来保存当前的状态
尝试使用状态模式来提取单词,下面就是代码。写完代码我发现状态模式要求状态的接口保持稳定,状态模式可以实现的是方便的增删状态,但不能修改动作。
package com.company; interface State{ public String getLetter(String word, char c); public String getNumber(String word, char c); public String getOthers(String word, char c); } class Machine{ private State startState; private State state1; private State state; private String target; public Machine(String target){ startState=new StartState(this); state1=new State1(this); state=startState; this.target=target; } public void setState(State state) { this.state = state; } public State getStartState() { return startState; } public State getState1() { return state1; } public void run(){ String word=""; for (int i = 0; i <target.length() ; i++) { char c=target.charAt(i); if(Character.isLetter(c))word=state.getLetter(word,c); else if(Character.isDigit(c))word=state.getNumber(word,c); else word=state.getOthers(word,c); } System.out.println(word); } } class StartState implements State{ private Machine machine; public StartState(Machine machine){ this.machine=machine; } @Override public String getOthers(String word, char c) { return ""; } @Override public String getLetter(String word, char c) { machine.setState(machine.getState1()); word+=c; return word; } @Override public String getNumber(String word, char c) { return ""; } } class State1 implements State{ private Machine machine; public State1(Machine machine){ this.machine=machine; } @Override public String getOthers(String word, char c) { machine.setState(machine.getStartState()); System.out.println(word); return ""; } @Override public String getLetter(String word, char c) { word+=c; return word; } @Override public String getNumber(String word, char c) { word+=c; return word; } } class StateTestDrive{ public static void test(){ String s=" class StartState implements State{ " + " private Machine machine; " + " public StartState(Machine machine){ " + " this.machine=machine; " + " }"; Machine machine=new Machine(s); machine.run(); } }