給學(xué)校做網(wǎng)站合肥百度競價推廣代理公司
文章目錄
- 狀態(tài)模式
- 代碼實(shí)現(xiàn)
- 代碼解釋
- 小結(jié)
狀態(tài)模式
狀態(tài)模式(State Pattern)是一種行為設(shè)計模式,它允許對象在內(nèi)部狀態(tài)改變時改變它的行為。在嵌入式系統(tǒng)中,狀態(tài)模式尤其適用于那些根據(jù)外部事件或內(nèi)部條件頻繁改變狀態(tài)并且每種狀態(tài)下行為不同的場景,例如設(shè)備的不同工作模式切換、任務(wù)調(diào)度、傳感器狀態(tài)管理、通信協(xié)議狀態(tài)機(jī)等。
代碼實(shí)現(xiàn)
#include <stdio.h>// 定義ACTION_PREPARE, ACTION_RUN, ACTION_END為合適的宏或整數(shù)值
#define ACTION_PREPARE 1
#define ACTION_RUN 2
#define ACTION_END 3// 首先聲明 WashingMachine 結(jié)構(gòu)體
typedef struct WashingMachineTag WashingMachine;// 定義狀態(tài)枚舉
typedef enum {STATE_STANDBY,STATE_PREPARING,STATE_RUNNING,STATE_FINISHED
} WashingMachineState;// 定義指向處理函數(shù)的指針類型
typedef void (*StateMachineAction)(WashingMachine *);// 洗衣機(jī)結(jié)構(gòu)體
struct WashingMachineTag {WashingMachineState state;StateMachineAction on_prepare;StateMachineAction on_run;StateMachineAction on_end;
} ;// 待機(jī)狀態(tài)下準(zhǔn)備
static void standby_prepare(WashingMachine *machine) {printf("Machine is preparing for washing.\n");machine->state = STATE_PREPARING;
}// 準(zhǔn)備狀態(tài)下運(yùn)行
static void preparing_run(WashingMachine *machine) {printf("Machine has started running.\n");machine->state = STATE_RUNNING;
}// 運(yùn)行狀態(tài)下結(jié)束
static void running_end(WashingMachine *machine) {printf("Washing cycle completed.\n");machine->state = STATE_FINISHED;
}// 初始化洗衣機(jī)狀態(tài)及其對應(yīng)的處理函數(shù)
void init_washing_machine(WashingMachine *machine) {machine->state = STATE_STANDBY;machine->on_prepare = standby_prepare;machine->on_run = preparing_run;machine->on_end = running_end;
}// 根據(jù)當(dāng)前狀態(tài)執(zhí)行相應(yīng)操作
void operate_washing_machine(WashingMachine *machine, int action) {switch (machine->state) {case STATE_STANDBY:if (action == ACTION_PREPARE) {machine->on_prepare(machine);} else {printf("Invalid action in STANDBY state.\n");}break;case STATE_PREPARING:if (action == ACTION_RUN) {machine->on_run(machine);} else {printf("Invalid action in PREPARING state.\n");}break;case STATE_RUNNING:if (action == ACTION_END) {machine->on_end(machine);} else {printf("Invalid action in RUNNING state.\n");}break;case STATE_FINISHED:printf("Machine is already in FINISHED state.\n");break;default:printf("Unknown machine state.\n");break;}
}int main() {WashingMachine machine;init_washing_machine(&machine);// 根據(jù)實(shí)際需求調(diào)用操作函數(shù)operate_washing_machine(&machine, ACTION_PREPARE);operate_washing_machine(&machine, ACTION_RUN);operate_washing_machine(&machine, ACTION_END);return 0;
}
代碼解釋
代碼示例展示了如何使用狀態(tài)模式來模擬一個具有待機(jī)、準(zhǔn)備、運(yùn)行和結(jié)束四種狀態(tài)的洗衣機(jī)設(shè)備??偨Y(jié)要點(diǎn)如下:
定義了WashingMachineState枚舉類型,用于表示洗衣機(jī)的不同狀態(tài)(待機(jī)、準(zhǔn)備、運(yùn)行和結(jié)束)。
定義了一個指向函數(shù)的指針類型StateMachineAction,該類型表示在不同狀態(tài)下執(zhí)行動作的函數(shù)指針。
創(chuàng)建了WashingMachine結(jié)構(gòu)體,其中包含當(dāng)前狀態(tài)字段和三個函數(shù)指針成員,分別對應(yīng)在不同狀態(tài)下需要執(zhí)行的動作。
定義了三個靜態(tài)函數(shù),分別是standby_prepare、preparing_run和running_end,這三個函數(shù)分別對應(yīng)洗衣機(jī)從待機(jī)到準(zhǔn)備、從準(zhǔn)備到運(yùn)行、從運(yùn)行到結(jié)束狀態(tài)的轉(zhuǎn)換。
init_washing_machine函數(shù)用于初始化洗衣機(jī)對象,設(shè)置初始狀態(tài)和對應(yīng)狀態(tài)下的動作函數(shù)。
operate_washing_machine函數(shù)根據(jù)當(dāng)前洗衣機(jī)的狀態(tài)執(zhí)行相應(yīng)的動作。在本示例中,動作的選擇依賴于傳入的action參數(shù),但是實(shí)際上可能根據(jù)狀態(tài)機(jī)的規(guī)則自行定義。
定義了宏ACTION_PREPARE、ACTION_RUN和ACTION_END,雖然在給出的代碼片段中并未具體使用,但在實(shí)際應(yīng)用中,這些宏或類似的常量可用于指示要執(zhí)行的具體動作。
小結(jié)
本文通過狀態(tài)模式分離了洗衣機(jī)狀態(tài)的改變和對應(yīng)狀態(tài)下的行為,使得狀態(tài)之間的轉(zhuǎn)換變得清晰且易于維護(hù)。當(dāng)狀態(tài)變化時,只需調(diào)用相應(yīng)狀態(tài)下的動作函數(shù)即可完成狀態(tài)的遷移和對應(yīng)行為的執(zhí)行。