状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。
策略模式和状态模式有点相似,区别就是状态模式是行为改变状态,主要在于状态改变行为的应用场景,而策略模式则是采用哪种算法,让Context去实现哪种算法,决定权在于客户端。状态模式的行为是平行的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的。
主要有三个角色:
环境角色(Context):保留客户端所需要的一些接口,并保留一个具体状态类的实例。
package design.state;
public class Context {
private State state;
public void setState(State state) {
this.state = state;
}
//定义客户端调用接口
public void request(String para){
state.handle(para);
}
}
抽象状态角色(State):作为一个接口,封装环境对象的一个特定的状态所对应的行为。
package design.state;
public interface State {
public void handle(String para);
}
具体状态角色(ConcreteState):实现具体的接口定义行为。
package design.state;
public class ConcreteStateA implements State{
@Override
public void handle(String para) {
System.out.println("ConcreteStateA handle:"+para);
}
}
package design.state;
public class ConcreteStateB implements State{
@Override
public void handle(String para) {
System.out.println("ConcreteStateB handle:"+para);
}
}
测试
package design.state;
public class Client {
public static void main(String[] args) {
//创建状态
State state=new ConcreteStateA();
State state1=new ConcreteStateB();
//创建环境
Context context=new Context();
//设置状态
context.setState(state);
//请求
context.request("test");
//设置状态
context.setState(state1);
//请求
context.request("test");
}
}
结果
ConcreteStateA handle:test
ConcreteStateB handle:test