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();
}
}