23种设计模式 之 State模式(状态模式) C语言

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               


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 模式使用

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_43667184/article/details/84102504
今日推荐