状态模式

状态模式

1.何为状态模式

​ 允许一个对象在其内部状态改变时改变它的行为。从而使对象看似修改了它的行为。本质上是将状态封装为对象。

2.状态模式的意义和使用场景

​ 在软件构建过程中,某些对象的行为会随着状态的变化而变化。而状态通常是不稳定的(可能增加、变化),状态模式通过将状态封装为对象实现在运行时根据对象的状态改变对象的行为,实现了具体行为和状态转换之间的解耦。为不同状态创建不同状态对象同时使得状态转换更加明确。

3.状态模式的实现

​ 创建一个状态抽象基类,在抽象基类中定义接口。具体状态从该基类继承而来,并重写接口。在需要使用状态的对象内部包含状态抽象基类指针,实现运行时根据对象的状态改变对象的行为。可以结合单例模式来节约内存。

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
54
55
56
57
// 抽象状态类
class State {
public:
State* pnext;//下一状态
virtual void handle() = 0;
};

// 具体状态类 - 开始状态
class StartState : public State { //这个继承是继承接口
static State* m_state;
public:
static State* getInstance()
{
if(m_state == nullptr)
{
m_state = new StartState();
}
return m_state;
}
void handle() override {
std::cout << "The current state is start state" << std::endl;
pnext = EndState::getInstance();
}
};
// 具体状态类 - 结束状态
class EndState : public State {
tatic State* m_state;
public:
static State* getInstance()
{
if(m_state == nullptr)
{
m_state = new EndState();
}
return m_state;
}
void handle() override {
std::cout << "The current state is end state" << std::endl;
}
};
// 上下文类 - 它包含一个状态对象,可以根据状态对象调用不同的方法
class Context {
private:
State* state;

public:
Context(State* state) : state(state) {}

void setState(State* state) {
this->state = state;
}

void execute() {
state->handle();
state = state->pnext;
}
};