- 作者:邹祁峰
- 邮箱:Qifeng.zou.job@hotmail.com
- 博客:http://blog.csdn.net/qifengzou
- 日期:2012.11.14
- 转载请注明来自"祁峰"的CSDN博客
1 概念定义
State模式:允许一个对象在其状态发生改变时,改变它的行为。
State模式和Strategy模式非常相似,需要说明的是两者的思想是一致的;只不过封装的对象不同:State模式封装的是不同的状态,而Strategy模式封装的是不同的算法。
State模式主要解决的问题是:在开发过程中,时常遇到需要根据不同的状态需要进行不同的处理操作的问题。大部分人采用的是switch-case语句进行处理的,这样会造成分支过多。State模式采用了对这些不同状态进行封装的方式处理这类问题,当状态发生变化时进行处理,再切换至另外一种状态,也就是说将状态切换的任务交给了状态类去负责。
2 模式结构图
图1 State模式结构图
3 场景设计
人的一生需经历:婴儿、青少年、中年、老年这几个阶段(状态),每个阶段对应的行为:婴儿->喝奶 青少年->学习 中年->工作 老年->退休。请用程序模拟这个过程的变化。
4 C语言实现
-> 结构定义
// 人生状态 typedef enum { PSTATE_BABY, // 婴儿 PSTATE_YOUNG, // 青少年 PSTATE_MIDDLE, // 中年 PSTATE_OLD, // 老年 PSTATE_TOTAL // 状态个数 }person_state_e;
// 人类:结构体 typedef struct { ... int (*action)(void); // 状态对应的行为 ... }person_t;
代码1 结构定义
-> 状态行为
// 婴儿状态:喝奶, etc. int drink(void) { fprintf(stdout, "I am drinking milk!"); return 0; } ...
// 青少年状态:学习, etc. int study(void) { fprintf(stdout, "I am study!"); return 0; } ...
// 中年状态:工作, etc. int work(void) { fprintf(stdout, "I am working!"); return 0; } ...
// 老年状态:退休, etc. int retire(void) { fprintf(stdout, "I am have been retired!"); return 0; } ...
代码2 状态行为
-> 状态切换
// 状态切换 int setstate(person_state_e state, person_t *person) { switch(state) { case PSTATE_BABY: { ... person.action = drink; ... break; } case PSTATE_YOUNG: { ... person.action = study; ... break; } case PSTATE_MIDDLE: { ... person.action = work; ... break; } case PSTATE_OLD: { ... person.action = retrie; ... break; } default: { return -1; } } return 0; }
代码3 状态切换
-> State模式的使用
int main(int argc, const char *argv[]) { person_t person; memset(person, 0, sizeof(person)); setstate(PSTATE_BABY, &person); person.action(); ... setstate(PSTATE_YOUNG, &person); person.action(); ... setstate(PSTATE_MIDDLE, &person); person.action(); ... setstate(PSTATE_OLD, &person); person.action(); ... return 0; }
代码4 模式使用