定义:

  • 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

    特点:

  • 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。(优点)

  • 减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。(优点)
  • 有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。(优点)
  • 状态模式的使用必然会增加系统的类与对象的个数。(缺点)

    通常适用场景:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

  • 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。

    demo代码:

  • 处理类

    1. public class ProcessHandle {
    2. private State state;
    3. //默认初始状态
    4. public ProcessHandle() {
    5. this.state = new AState();
    6. }
    7. //对请求做处理
    8. public void handle() {
    9. state.process(this);
    10. }
    11. public void setState(State state) {
    12. this.state = state;
    13. }
    14. public State getState() {
    15. return state;
    16. }
    17. }
  • 状态类 ```java //状态类 public interface State { default void process(ProcessHandle processHandle) { } }

//A状态 public class AState implements State { @Override public void process(ProcessHandle processHandle) { System.out.println(“当前状态是 A.”); processHandle.setState(new BState()); } }

//B状态 public class BState implements State { @Override public void process(ProcessHandle processHandle) { System.out.println(“当前状态是 B.”); processHandle.setState(new AState()); } }

  1. - 测试
  2. ```java
  3. public static void main(String[] args) {
  4. ProcessHandle processHandle =ProcessHandle(); //处理Handle
  5. processHandle.handle(); //A状态
  6. processHandle.handle(); //B状态
  7. processHandle.handle(); //A状态
  8. processHandle.handle(); //B状态
  9. }