状态模式(State Pattern)
# 状态模式(State Pattern)
# 概念
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下具有不同的行为,而不必使用大量的条件语句来判断当前状态。
# 思想
状态模式的思想是将对象的行为和状态分离,使得对象的状态变化对客户端透明。它通过定义表示不同状态的状态类,并将其封装在上下文类中,实现状态之间的切换和相应行为的触发。
# 角色
- Context(上下文):定义客户端所感兴趣的接口,并维护一个具体状态类的实例,用于处理状态切换和行为的委托。
- State(状态):定义一个接口或抽象类,用于封装与上下文相关的行为。
- ConcreteState(具体状态):实现状态接口或抽象类,在不同状态下具体实现相应的行为。
# 优点
- 将对象的状态和行为分离,使得状态转换更加灵活和可扩展。
- 遵循开闭原则,易于增加新的状态类和行为。
- 简化了大量的条件语句,提高了代码可读性和可维护性。
# 缺点
- 增加了系统的类和对象的个数,增加了系统的复杂性。
- 状态类的增加可能导致上下文类的复杂化。
- 状态模式需要额外的结构代码,增加了系统的实现难度。
# 类图
@startuml
class Context {
+request()
-state: State
+setState(state: State)
+getState(): State
}
class State {
+handle(context: Context)
}
class ConcreteStateA {
+handle(context: Context)
}
class ConcreteStateB {
+handle(context: Context)
}
Context --> State
Context --> ConcreteStateA
Context --> ConcreteStateB
note right of Context::state
Current State
end note
note top of Context
Client
end note
@enduml
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
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
# 时序图
@startuml
participant Client
participant Context
participant State
Client -> Context: request()
activate Context
Context -> State: handle()
activate State
State --> Context: handle()
deactivate State
deactivate Context
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 示例代码
以下是一个简单的示例代码,使用C++实现状态模式的概念。假设有一个灯(Light)对象,它有两种状态:开(On)和关(Off)。根据不同的状态,灯的行为(比如开灯和关灯)将有所不同。
#include <iostream>
// 状态接口
class State {
public:
virtual void handle() = 0;
};
// 具体状态类:开灯
class OnState : public State {
public:
void handle() override {
std::cout << "灯已经打开" << std::endl;
}
};
// 具体状态类:关灯
class OffState : public State {
public:
void handle() override {
std::cout << "灯已经关闭" << std::endl;
}
};
// 上下文类:灯
class Light {
private:
State* state;
public:
Light() {
state = new OffState(); // 初始状态为关灯
}
void setState(State* newState) {
state = newState;
}
void request() {
state->handle();
}
};
int main() {
Light light;
light.request(); // 输出:灯已经关闭
light.setState(new OnState());
light.request(); // 输出:灯已经打开
return 0;
}
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
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
示例代码中定义了State
接口和两个具体状态类OnState
和OffState
,以及上下文类Light
。初始状态下,灯的状态是关灯(OffState
)。通过调用setState
方法可以改变灯的状态。request
方法用于触发当前状态的行为。
代码运行结果:
灯已经关闭
灯已经打开
1
2
2
该示例演示了状态模式的基本原理,根据不同的状态,灯的行为发生了改变。
编辑 (opens new window)
上次更新: 2023/06/09, 13:17:31
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05