状态模式(State)

1

定义

  状态模式(State):属于行为型模式,允许对象的内部状态变化时改变其行为,使其看上去像改变自身所属类一样。

  状态模式和策略模式类似,只不过状态模式更偏重于状态的自变化,策略模式强调策略的人为选择。如快递状态的变化,从打包->运输->存储;心情的变化,从生气->开心等。策略的变化如支付方法,选择微信或者支付宝,选择骑车、开车、还是步行等。

代码实战

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
interface State {
void operation(Express express);
}

class Pack implements State {
@Override
public void operation(Express express) {
System.out.println("express is packing");
express.setState(new Transport());
}
}

class Transport implements State {
@Override
public void operation(Express express) {
System.out.println("express is transporting");
express.setState(new Store());
}
}

class Store implements State {
@Override
public void operation(Express express) {
System.out.println("express is storing");
}
}

class Express {
State state = new Pack();

void print() {
state.operation(this);
}

public void setState(State state) {
this.state = state;
}
}

class Test {
public static void main(String[] args) {
Express express = new Express();
express.print();
express.print();
express.print();
}
}

类图

1

特点

  状态模式的特点是,创建一个状态接口,让各个具体状态实现该接口。客户端使用时持有这个接口,并提供一个setState的方法,去修改状态。

  上面说的这些和策略模式一模一样,但是状态接口需要依赖于客户端,当某个动作执行完以后,状态可能会自动发生变化,所以需要在实现类中调用客户端的setState,修改到下一个状态。这是策略模式不具备的,但是缺点是增加了耦合,接口也依赖于客户端的实现。

总结

  状态模式使用的场景不如策略常见,一般业务的状态都是手动去维护,更加容易发现和定位问题。经常就写成了策略模式,策略和状态都是需要小伙伴们掌握的重点模式。

-------------本文结束感谢您的阅读-------------
0%