0%

设计模式 - 行为型模式 - 状态模式

设计模式

设计模式分为创建型模式、结构型模式和行为型模式。
创建型模式:创建对象。
结构型模式:把复杂结构分解为多个类,分解的是类本身(包括算法和属性)。
行为型模式:把复杂算法分解到多个类,分解的是算法。

行为型模式 - 状态模式

状态模式的设计思想来源于有限状态机的概念,即一个系统可以在不同条件触发时在不同状态之间转化。

UML 图

状态模式的 UML 图

示例代码

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
public class StatePattern {
public static void main(String[] args) {
Context context = new Context();
context.setState(new ConcreteStateA());
context.request();
context.request();
context.request();
}
}

interface State {
void handle(Context context);
}

class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("ConcreteStateA");
context.setState(new ConcreteStateB());
}
}

class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("ConcreteStateB");
context.setState(new ConcreteStateA());
}
}

class Context {
private State state;

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

public void request() {
state.handle(this);
}
}

输出

1
2
3
ConcreteStateA
ConcreteStateB
ConcreteStateA

应用实例

在写一个播放器逻辑的时候,通过状态模式可以实现播放器的状态转换。

状态模式和策略模式

本质上状态模式和策略模式都是基于组合而非继承的模式,将可变的算法分离成单独的类,通过接口去调用它们。它们的区别就在于状态模式多一个状态转换。

状态模式的 Client 代码:

1
2
3
4
5
6
7
8
9
public class StatePattern {
public static void main(String[] args) {
Context context = new Context();
context.setState(new ConcreteStateA()); // 多一个状态转换
context.request();
context.request();
context.request();
}
}

策略模式的 Client 代码:

1
2
3
4
5
6
public class StrategyPattern {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.contextInterface();
}
}