设计模式 状态模式
本文将介绍设计模式中的状态模式。
一、什么是状态模式?
在程序中,有些对象存在多种状态,对象可以在这些状态之间切换,并且对象在不同状态下具有不同的行为。这样的逻辑如果用 if、else 实现,条件判断语句将会十分复杂,并且也难以维护和扩展。
状态模式用于解决复杂对象的 “状态转换” 和 “不同状态下的行为切换” 问题,它将对象的状态从对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。
二、实现
1. 结构
2. 角色
- Context 环境类:
- 即拥有多个状态的对象
- 维护一个类型为 State 的实例
- 通过调用 State 实例来进行特定状态下的行为
- State 抽象状态类:
- 定义了与状态相关的方法
- ConcreteState 具体状态类:
- 每一个具体状态类对应着一个状态
- 实现了 State 中定义的方法
3. 简单示例
Context:
1 |
|
State:
1 |
|
ConcreteState:
1 |
|
状态的维护:
可以统一由环境类来负责状态之间的转换,通过对某些属性值的判断来实现状态转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19publice class Context {
private State state;
private int value;
public void setState() {
if (value == 0) {
state = ···;
} else {
state = ···;
}
}
public void request() {
// ···
state.handle();
// ···
}
}可以由状态类负责,提供一个方法供 Context 调用以修改状态
1
2
3
4
5
6
7
8
9
10
11public abstract class State {
public abstract void handle();
public void setState(Context context) {
if (context.getValue() == 0) {
state = ···;
} else {
state = ···;
}
}
}
三、优缺点
1. 优点
- 可以使用更优雅的方式维护有状态对象
2. 缺点
- 增加系统中类的数目
- 不符合开闭原则,增加新的状态类时需要修改状态转换相关代码
参考
- 《Java 设计模式》