1、定义状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
2、状态模式 和 策略模式的类图是一样的。 两个模式的差别在于他们的意图。
3、区别 状态模式:将一群行为封装在状态对象中,context的行为随时可委托到那些状态中的一个,当前状态在状态对象集合中游走改变,反映context内部改变。
策略模式:主动指定context所要组合策略对象的哪一个。能够在运行是改变策略,但对于某个context对象来说,通常只有一个最适当的策略对象。
简单事例:
/** * 状态接口 * @下午10:16:36 * @author ASUS */ public interface State { //第一个状态做的事情 public void one(); //第二个状态做的事情 public void two(); //第三个状态做的事情 public void three(); }
/** * 状态接口 * @下午10:16:36 * @author ASUS */ public interface State {
//第一个状态做的事情 public void one(); //第二个状态做的事情 public void two(); //第三个状态做的事情 public void three(); }
/** * 各状态对应的不同方法 * @下午10:55:47 * @author ASUS */ public class One implements State{
Machine machine; public One(Machine machine){ this.machine=machine; } @Override public void one() { System.out.println("第一个状态时 这样工作"); machine.setState(machine.getThree()); }
@Override public void three() { }
@Override public void two() { }
}
public class Two implements State{
Machine machine; public Two(Machine machine){ this.machine=machine; } @Override public void one() { // TODO Auto-generated method stub }
@Override public void three() { // TODO Auto-generated method stub }
@Override public void two() { System.out.println("第二个状态时 这样工作"); }
}
public class Three implements State{
Machine machine; public Three(Machine machine){ this.machine=machine; } @Override public void one() { // TODO Auto-generated method stub }
@Override public void three() { System.out.println("第三个 状态时 这样工作"); }
@Override public void two() { // TODO Auto-generated method stub }
}
/** * 按照状态工作的机器 * @下午10:43:52 * @author ASUS */ public class Machine { //状态 State one; State two; State three; //当前状态 State state; public Machine(){ one=new One(this); two=new Two(this); three=new Three(this); //刚开始时候的状态 state=new One(this); } public void oneDo(){ state.one(); } public void twoDo(){ state.two(); } public void threeDo(){ state.three(); } //很多getter方法和setter方法 获取设置状态 public State getOne() { return one; }
/** * 测试 * @下午10:58:07 * @author ASUS */ public class Test {
public static void main(String[] args) { Machine m=new Machine(); m.oneDo(); m.twoDo(); m.threeDo(); } }