当前位置:   article > 正文

23种设计模式 之 State模式(状态模式)[C语言实现]

cstate模式
一、概念定义

State模式:允许一个对象在其状态发生改变时,改变它的行为。

State模式和Strategy模式非常相似,需要说明的是两者的思想是一致的;只不过封装的对象不同:State模式封装的是不同的状态,而Strategy模式封装的是不同的算法。

State模式主要解决的问题是:在开发过程中,时常遇到需要根据不同的状态需要进行不同的处理操作的问题。大部分人采用的是switch-case语句进行处理的,这样会造成分支过多。State模式采用了对这些不同状态进行封装的方式处理这类问题,当状态发生变化时进行处理,再切换至另外一种状态,也就是说将状态切换的任务交给了状态类去负责。

二、模式结构图

图1 State模式结构图

三、场景设计

人的一生需经历:婴儿、青少年、中年、老年这几个阶段(状态),每个阶段对应的行为:婴儿->喝奶青少年->学习中->工作老年->退休。请用程序模拟这个过程的变化。

四、C语言实现

// 结构体定义

  1. // 人生状态
  2. typedef enum
  3. {
  4. PSTATE_BABY, // 婴儿
  5. PSTATE_YOUNG, // 青少年
  6. PSTATE_MIDDLE, // 中年
  7. PSTATE_OLD, // 老年
  8. PSTATE_TOTAL // 状态个数
  9. }person_state_e;
  1. // 人类:结构体
  2. typedef struct
  3. {
  4. ...
  5. int (*action)(void); // 状态对应的行为
  6. ...
  7. }person_t;

// 状态对应的行为

  1. // 婴儿状态:喝奶, etc.
  2. int drink(void)
  3. {
  4. fprintf(stdout, "I am drinking milk!");
  5. return 0;
  6. }
  7. ...
  1. // 青少年状态:学习, etc.
  2. int study(void)
  3. {
  4. fprintf(stdout, "I am study!");
  5. return 0;
  6. }
  7. ...
  1. // 中年状态:工作, etc.
  2. int work(void)
  3. {
  4. fprintf(stdout, "I am working!");
  5. return 0;
  6. }
  7. ...
  1. // 老年状态:退休, etc.
  2. int retire(void)
  3. {
  4. fprintf(stdout, "I am have been retired!");
  5. return 0;
  6. }
  7. ...

// 状态切换模块

  1. // 状态切换
  2. int setstate(person_state_e state, person_t *person)
  3. {
  4. switch(state)
  5. {
  6. case PSTATE_BABY:
  7. {
  8. ...
  9. person.action = drink;
  10. ...
  11. break;
  12. }
  13. case PSTATE_YOUNG:
  14. {
  15. ...
  16. person.action = study;
  17. ...
  18. break;
  19. }
  20. case PSTATE_MIDDLE:
  21. {
  22. ...
  23. person.action = work;
  24. ...
  25. break;
  26. }
  27. case PSTATE_OLD:
  28. {
  29. ...
  30. person.action = retrie;
  31. ...
  32. break;
  33. }
  34. default:
  35. {
  36. return -1;
  37. }
  38. }
  39. return 0;
  40. }

//State模式的使用

  1. int main(int argc, const char *argv[])
  2. {
  3. person_t person;
  4. memset(person, 0, sizeof(person));
  5. setstate(PSTATE_BABY, &person);
  6. person.action();
  7. ...
  8. setstate(PSTATE_YOUNG, &person);
  9. person.action();
  10. ...
  11. setstate(PSTATE_MIDDLE, &person);
  12. person.action();
  13. ...
  14. setstate(PSTATE_OLD, &person);
  15. person.action();
  16. ...
  17. return 0;
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/63434
推荐阅读
相关标签
  

闽ICP备14008679号