设计模式GOF23--状态模式

场景

  • 电梯的运行

    • 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态

  • 红绿灯
    • 红灯、黄灯、绿灯
  • 企业或政府系统
    • 公文的审批状态
      • 报销单据审批状态
      • 假条审批
  • 网上购物,订单的状态

  • 酒店系统中,房间的状态变化:

    • 已预定
    • 已入住
    • 空闲

核心

  • 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题

结构

  • Context环境类
    • 环境类中维护一个State对象,他是定义了当前的状态
  • State抽象状态类
  • ConcreteState具体状态类
    • 每一个类封装了一个状态对应的行为

不使用设计模式解决

代码解析(酒店系统模型)

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* 抽象状态类
*/
public interface State {
void handle();
}
/**
* 房间空闲
*/
public class FreeState implements State{
@Override
public void handle() {
System.out.println("房间空闲,没人住");
}
}
/**
* 已入住
*/
public class CheckedInState implements State{
@Override
public void handle() {
System.out.println("房间已入住");
}
}
/**
* 已预定
*/
public class BookedState implements State{
@Override
public void handle() {
System.out.println("房间已预定");
}
}
/**
* 环境类
*/
public class Context {
private State state;

public void setState(State state) {
System.out.println("修改状态");
this.state = state;
state.handle();
}
}
/**
* 状态模式
*/
public class Client {
public static void main(String[] args) {
Context ctx = new Context();
ctx.setState(new FreeState());
}
}

开发中常见的场景

  • 银行系统中账号状态的管理
  • OA系统中公文状态的管理
  • 酒店系统中,房间状态的管理
  • 线程对象各个状态之间的切换
注:该博文为学习总结,视频来源为高淇java300集