状态模式
状态模式定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情况。此时把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
状态模式结构图为:
状态模式结构图代码解析:
//抽象状态类
abstract class State{
public abstract void handle(Context context);
}
//ConcreteState类,指定具体状态,每一个子类实现一个与Context的一个状态相关的行为。
class ConcreteStateA(){
@Override
public void handle(Context context){
//设置ConreteStateA 的下一状态为ConreteStateB
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB(){
@Override
public void handle(Context context){
//设置ConreteStateB 的下一状态为ConreteStateA
context.setState(new ConcreteStateA());
}
}
//Context类,维护一个ConcreteState 子类的实例,这个实例定义当前状态
class Context{
private State state;
public Context(State state){
this.state = state;
}
//可以重新设置状态
public void setState(State state){
this.state = state;
print("当前状态:" + state);
}
//获取当前状态
public State getState(){
return state;
}
//处理请求,并设置下一状态
public void request(){
//处理请求。。。。
//不符合条件则进入下一状态。
state.handle(this);
}
}
//客户端代码
public class Main{
public static void main(String[] args){
//设置Context初始状态为 ConcreteStateA
Context c = new Context(new ConcreteStateA());
c.request();
//Context中的State子类实例已经被改变。
c.request();
c.request();
c.request();
}
}
状态模式的好处:将与特定状态相关的行为局部实例化,并且将不同状态的行为分割开来。这样的目的就是消除庞大的条件分支语句。状态模式通过把各种状态转移逻辑分布到各个State子类中,减少相互依赖,这也符合开闭原则和单一职责原则。
什么时候用状态模式呢?当一个对象的行为取决于他的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。如果业务需求某项业务有多个状态,通常都是枚举常量,状态的变化都是靠大量分支判断语句来实现,此时可以将每一种业务状态定义为一个State的子类。