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