赞
踩
State模式:允许一个对象在其状态发生改变时,改变它的行为。
State模式和Strategy模式非常相似,需要说明的是两者的思想是一致的;只不过封装的对象不同:State模式封装的是不同的状态,而Strategy模式封装的是不同的算法。
State模式主要解决的问题是:在开发过程中,时常遇到需要根据不同的状态需要进行不同的处理操作的问题。大部分人采用的是switch-case语句进行处理的,这样会造成分支过多。State模式采用了对这些不同状态进行封装的方式处理这类问题,当状态发生变化时进行处理,再切换至另外一种状态,也就是说将状态切换的任务交给了状态类去负责。
二、模式结构图
图1 State模式结构图
三、场景设计
人的一生需经历:婴儿、青少年、中年、老年这几个阶段(状态),每个阶段对应的行为:婴儿->喝奶青少年->学习中年->工作老年->退休。请用程序模拟这个过程的变化。
四、C语言实现
// 结构体定义
- // 人生状态
- typedef enum
- {
- PSTATE_BABY, // 婴儿
- PSTATE_YOUNG, // 青少年
- PSTATE_MIDDLE, // 中年
- PSTATE_OLD, // 老年
- PSTATE_TOTAL // 状态个数
- }person_state_e;
- // 人类:结构体
- typedef struct
- {
- ...
- int (*action)(void); // 状态对应的行为
- ...
- }person_t;
// 状态对应的行为
- // 婴儿状态:喝奶, 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;
- }
- ...
// 状态切换模块
- // 状态切换
- 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;
- }
//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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。