状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
State接口(抽象类)定义了一个生成所有具体状态的共同接口,那么实现接口的状态类可以互相转换。
Context类拥有一些状态,通过request()方法请求某状态对象的行为
ConcreteStateA是实现接口的一个具体状态类,提供本状态特有的实现处理来自Context的请求,使得Context改变状态时行为也发生改变。
定义一个State接口,包含了所有状态的方法(抽象类可以减少代码重复)
public interface State{
insertQuarter();
dispense();
}
封装变化,状态类实现接口,修改封闭,将每个状态的行为放到各自的类中(行为局部化)
实现符合这个状态的行为,某些情况下改变Context状态从而使得Context使用另一个状态实例的方法
public class NoQuarterState implements State{
GunballMachine gunMa;
public NoQuarterState(GUnballMachine gunMa){
this.gunMa=gunMa;
}
public void insertQuarter(){
//System..
gunMa.setState(gunMa.getHasQuarterState()); //让Context状态改变
}
//其它方法
}
多用组合,Context委托状态给相应的状态对象,
包含所有的状态实例,某刻只有一个状态
可以加入其他状态类对扩展开放
public class GumballMachine{
State noQuarterState;
//State ..
State state=noQuarterState; //初始状态
int count=0; //一些状态改变的判断条件
public GumballMachine(int numberGumballs){ //通过初始数量来决定状态
noQrarterState=new NoQuarter(this); //为每种状态类创建实例
//
this.count=numberGumballs;
if(count>0){
state=
}
}
public void insertQuarter(){
state.insertQuarter(); //动作不自己实现,委托到了相应状态对象中
}
//其他类似行为
public void turnGrank(){ //Context的内部动作,通过状态对象进行调用
state.dispense();
}
void setState(State state){ //允许状态对象转换状态
this.state=state;
}
//其他方法,比如改变判断条件,set,get
}
总结:这个模式将状态封装成独立的类,通过简单引用不同的状态对象将动作委托到代表当前状态的对象,行为随内部状态而改变。与策略模式相比,策主动指定组合对象改变行为,状通过状态对象改变行为而又不用使用依赖型的条件判断。