状态模式

7/13/2021

# 状态模式定义

状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

# 何时使用

  • 当一个对象的行为取决于它的状态,并且你希望在不同的状态下表现不同的行为时。
  • 代码中包含大量与对象状态有关的条件语句

# 状态模式实现

// 上下文类,它可以拥有一些内部状态
public class Context {
    private State state;
    public void request() {
        // 不管什么时候,调用 request 方法,都会被委托到状态类来处理
        state.handle();
    }
    void setState(State state) {
        this.state = state;
    }
}

// State 类
public class State {
    public void handle() {
      ...
    }
}

// ConcreteState 类
public class ConcreteStateA extends State {
    Context context;
    ConcreteStateA(Context context) {
        this.context = context;
    }
    public void handle() {
        System.out.println("handle state A");
        context.setState(new ConcreteStateB(context));
    }
}

// ConcreteState 类
public class ConcreteStateB extends State {
    public void handle() {
        System.out.println("handle state A");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 问题

是谁来决定状态转移的逻辑

  • 当状态转换是固定的时候,适合放在 Context 中
  • 转换时动态的时候,适合放在状态类中 (根据运行时上下文中某些变量值来决定转换成什么状态)
    • 缺点:状态类之间产生了依赖

客户能直接和具体状态交互吗:不能

  • 客户不能直接改变状态
  • 客户根本不了解现在的具体状态