1. 程式人生 > >23種設計模式 之 State模式(狀態模式) C語言

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

這裡寫圖片描述