应用场景描述: 一个开关可以被pull或者push,共有三种不同的颜色,称为状态,每种不同的颜色下执行push或者pull得到的下一个状态不同,即一个有穷状态机,对不同的输入有不同的响应。因为状态改变比较复杂,因此不用if和else来实现。而是定义一个state的父类,然后开关不同的颜色继承这个state父类。根据不同的pull或者push来改变颜色。
the State and Stategy
How to implement state-dependent behavior
The state patterns
具体的应用场景:
例如: 经典的TcpConnection, Tcp的状态有创建 侦听 关闭三个,并且反复转换,其创建 侦
听 关闭的具体行为不是简单一两句就能完成的,适合使用 State
例如:信箱 POP 帐号, 会有四种状态, start HaveUsername Authorized quit,每个状态对应
的行为应该是比较大的.适合使用 State
例如:在工具箱挑选不同工具,可以看成在不同工具中切换,适合使用 State.如 具体绘图程
序,用户可以选择不同工具绘制方框 直线 曲线,这种状态切换可以使用 State.
public class Context{
private Sate state=null; // 状态管理者Context有state成员
pulic void setState(State state) //setState 是用来改变 state 的状态 使用 setState 实现状态的切换
{
this.state=state;}
public void push(){
state.handlepush(this); //状态的切换的细节部分,在本例中是颜色的变化,已经封装在子类的handlepush 中实现,这里无需关心
//即context类里的state这个成员状态的改变不是由context完成的,而是state自己改变了context的状态,见后面state的定义
Sample sample=new Sample(state.getColor()); //因为 sample 要使用 state 中的一个切换结果,使用 getColor()
sample.operate();
}
public void pull(){
state.handlepull(this);
Sample2 sample2=new Sample2(state.getColor());
sample2.operate();
}
}
状态类继承state父类,实现不同的状态下的不同行为
public class BlueState extends State{
public void handlepush(Context c){
//根据 push 方法"如果是 blue 状态的切换到 green" ;
c.setState(new GreenState()); // 这样context类无需关心自己的当前状态是啥,因为state类已经在此处操作了
}
public void handlepull(Context c){
//根据 pull 方法"如果是 blue 状态的切换到 red" ;
c.setState(new RedState());
}
public abstract void getcolor(){ return (Color.blue)}