状态模式
状态机
在操作系统的调度中会存在三种状态:运行、就绪、阻塞。
这是比较典型的状态机的例子。
做产品的时候,我们总能遇到一些比较复杂的逻辑问题,而普通的流程图,或时序图对于对象和状态的解读缺乏直观的描述。
这里我们推荐使用简单的状态图来对逻辑问题进行描述:
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。
状态模式
状态模式简单来说就是使用不同的状态,来描述一个在有限状态中转化的问题。
同时使用不同状态下不同的响应方式,来对有限问题做出解决。
C语言状态模式实现
给出如下场景,在一个字符串中,我们希望获取其中单词的个数。
使用状态的转换对单词的描述。
enum StrState{
BEGIN = 1,INWORD, OUTWORD
};
int getWordNum(const char* str) {
StrState state = BEGIN;
int num = 0;
for (int i = 0; str[i] != '\0'; ++i) {
switch (state)
{
case BEGIN:
if (isalpha(str[i])) {
state = INWORD;
}
else {
state = OUTWORD;
}
break;
case INWORD:
if (!isalpha(str[i])) {
state = OUTWORD;
num++;
}
break;
case OUTWORD:
if (isalpha(str[i])) {
state = INWORD;
}
break;
default:
break;
}
}
if (state == INWORD) num++;
return num;
}
int main() {
cout << getWordNum(" sss sss ss hello ");
}
面向对象+多态实现
场景:公主亲青蛙,青蛙变成王子
当状态发生变化时,青蛙转变为王子
class Creature {
class State {
public:
virtual string response() = 0;
};
class Frog : public State {
string response() {
return "Ribble";
}
};
class Prince : public State {
string response() {
return "Darling";
}
};
private:
State* sp;
public:
Creature() {
sp = new Frog();
}
void kiss() {
delete sp;
sp = new Prince();
}
void greet() {
cout << sp->response() << endl;
}
~Creature() {
delete sp;
sp = nullptr;
}
};
int main() {
Creature ca;
ca.greet();
ca.kiss();
ca.greet();
}