一、概念

状态模式:允许一个对象在其内部状态改变时改变它的行为。

二、组成结构

1 ) 使用环境(Context)角色: 客户程序是通过它来满足自己的需求。它定义了客户程序需要的接口;并且维护一个具体状态角色的实例,这个实例来决定当前的状态。
2 ) 状态(State)角色: 定义一个接口以封装与使用环境角色的一个特定状态相关的行为。
3 ) 具体状态(Concrete State)角色: 实现状态角色定义的接口。

类图:

Java Statement插入数据 java中的statement_System

三、示例代码

环境角色 - Context

public class Context {
   private State state;
 
   public Context(State state){
      this.state = state;
   }
   public State getState(){
      return state;
   }
   public String request(){
      return state.handler ();
   }
}

状态角色,具体状态角色

public interface State {
   String handler();
}
public class StartState implements State {
 
   public String handler() {
      System.out.println("开始状态,处理。");
      return "Started";
   }
}
public class FinishState implements State {
 
   public String handler() {
      System.out.println("结束状态,处理!");
      return "Finished!";
   }
}

测试

public class Main {
    public static void main(String[] args) {

        StartState startState = new StartState();
        FinishState finishState = new FinishState();

        Context context = new Context(startState);
        System.out.println(context.request ());
        context = new Context(finishState);
        System.out.println(context.request ());
    }
}

结果:

Java Statement插入数据 java中的statement_System_02

四、状态模式与策略模式

strategy 模式在结构上与 state模式非常相似,但是在概念上,他们的目的差异非常大。区分这两个模式的关键是看行为是由状态驱动还是由一组算法驱动,这条规则似乎有点随意,但是在判断时还是需要考虑它。
通常,State 模式的“状态”是在对象内部的,Strategy 模式的“策略”可以在对象外部,不过这也不是一条严格、可靠的规则。

策略模式中,算法是否变化完全是由客户程序开决定的,而且往往一次只能选择一种算法,不存在算法中途发生变化的情况。
而状态模式如定义中所言,在它的生命周期中存在着状态的转变和行为得更改,而且状态变化是一个线形的整体;对于客户程序来言,这种状态变化往往是透明的。

五、状态模式的优点

适用范围:
1 ) 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
2 ) 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

优点:
1 )减少分支条件的判断;
2 )减少耦合