定义
允许一个类在其内部状态改变时,改变它的行为。
状态成为了类。修改类状态同时出发其他操作。
场景
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
简单来说:
1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2. 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
类图
上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
抽象状态(State):用以封装使用上下文环境的的一个特定状态相关的行为。
具体状态(Concrete State):实现抽象状态定义的接口。
实现
抽象状态
public abstract class State {
private String stateName;
public State(String stateName){
this.stateName = stateName;
}
public String name(){
return this.stateName;
}
public abstract void action(Context context);
}
开启状态
public class OpenSate extends State{
public OpenSate() {
super("open");
}
public void action(Context context) {
System.out.println("当前状态为:"+context.getState().name() + ",将要切换为:close");
context.setState(new CloseState());
}
}
关闭状态
public class CloseState extends State{
public CloseState() {
super("close");
}
public void action(Context context) {
System.out.println("当前状态为:"+context.getState().name() + ",将要切换为:open");
//修改上下文状态
context.setState(new OpenSate());
}
}
上下文对象
public class Context {
private State state;
public Context(State state){
this.state=state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void stateChange(){
/*
* 触发状态的操作
* 操作的过程中会修改上下文的状态
*/
state.action(this);
}
}
调用
public class Client {
/**
* out.eg:当前状态为:open,将要切换为:close
* 当前状态为:close,将要切换为:open
* 当前状态为:open,将要切换为:close
* 当前状态为:close,将要切换为:open
*/
public static void main(String[] args) {
Context context = new Context(new OpenSate());
context.stateChange();
context.stateChange();
context.stateChange();
context.stateChange();
}
}
跟观察者区别
观察者:观察状态,状态便跟抛出事件,观察者执行
状态模式:改变状态,操作自己就完成了,没有第三者去关注你状态的变化