设计模式系列:状态模式

概念

状态模式是将对象的状态接口抽出,从状态的维度出发描述对象。对象千千万,状态
就那么几个,所以从状态的维度度量。业务上会清晰很多。

实现

类图

图片

代码

  • 抽象状态 CarState

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package com.littlehui.design.state;

    /**
    * @Description TODO
    * @ClassName CarState
    * @Author littlehui
    * @Date 2020/4/7 17:09
    * @Version 1.0
    **/
    public interface CarState {

    public void doCarAction(Car car);
    }
  • 具体状态 start,run,stop

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
package com.littlehui.design.state;

/**
* @Description TODO
* @ClassName CarStart
* @Author littlehui
* @Date 2020/4/7 17:10
* @Version 1.0
**/
public class CarStart implements CarState {
public void doCarAction(Car car) {
System.out.println("汽车启动中。");
car.setState(1);
}
}


package com.littlehui.design.state;

/**
* @Description TODO
* @ClassName CarRun
* @Author littlehui
* @Date 2020/4/7 17:10
* @Version 1.0
**/
public class CarRun implements CarState {
public void doCarAction(Car car) {
car.setState(2);
System.out.println("汽车在行驶中。");
}
}


package com.littlehui.design.state;

/**
* @Description TODO
* @ClassName CarStop
* @Author littlehui
* @Date 2020/4/7 17:11
* @Version 1.0
**/
public class CarStop implements CarState {
public void doCarAction(Car car) {
car.setState(0);
System.out.println("汽车停止。");
}
}
  • 上下文 Car
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
package com.littlehui.design.state;

/**
* @Description TODO
* @ClassName Context
* @Author littlehui
* @Date 2020/4/7 17:07
* @Version 1.0
**/
public class Car {

/**
* 0 停止
* 1 启动中
* 2 奔跑中
*/
private int state;

public int getState() {
return state;
}

public void setState(int state) {
this.state = state;
}
}
  • 客户端调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.littlehui.design.state;

/**
* @Description TODO
* @ClassName Client
* @Author littlehui
* @Date 2020/4/7 17:18
* @Version 1.0
**/
public class Client {

public static void main(String[] args) {
Car car = new Car();
CarStart carStart = new CarStart();
carStart.doCarAction(car);
CarRun carRun = new CarRun();
carRun.doCarAction(car);
CarStop carStop = new CarStop();
carStop.doCarAction(car);
}

}
  • 执行结果
1
2
3
4
5
6

Connected to the target VM, address: '127.0.0.1:64995', transport: 'socket'
汽车启动中。
汽车在行驶中。
汽车停止。
Disconnected from the target VM, address: '127.0.0.1:64995', transport: 'socket'

场景

总结

  • 好处
    状态控制放到了服务的内部,客户端不用操作具体的状态流转业务逻辑。可以分节点操作,扩展性能比较好。
    上面这个例子只是很简单的模仿了一下工作流控制状态的跳转。状态模式最主要的好处就是把状态的判断与控制放到了其服务端的内部,使得客户端不需要去写很多代码判断,来控制自己的节点跳转,而且这样实现的话,我们可以把每个节点都分开来处理,当流程流转到某个节点的时候,可以去写自己的节点流转方法。

  • 坏处
    状态类要同时实现。耦合度会高。