嵌入式开发中状态模式实现

状态模式

状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变它的行为。在嵌入式系统中,状态模式尤其适用于那些根据外部事件或内部条件频繁改变状态并且每种状态下行为不同的场景,例如设备的不同工作模式切换、任务调度、传感器状态管理、通信协议状态机等。

代码实现

#include <stdio.h>


// 定义ACTION_PREPARE, ACTION_RUN, ACTION_END为合适的宏或整数值
#define ACTION_PREPARE 1
#define ACTION_RUN     2
#define ACTION_END     3

// 首先声明 WashingMachine 结构体
typedef struct WashingMachineTag WashingMachine;

// 定义状态枚举
typedef enum {
    STATE_STANDBY,
    STATE_PREPARING,
    STATE_RUNNING,
    STATE_FINISHED
} WashingMachineState;

// 定义指向处理函数的指针类型
typedef void (*StateMachineAction)(WashingMachine *);

// 洗衣机结构体
struct WashingMachineTag  {
    WashingMachineState state;
    StateMachineAction on_prepare;
    StateMachineAction on_run;
    StateMachineAction on_end;
} ;

// 待机状态下准备
static void standby_prepare(WashingMachine *machine) {
    printf("Machine is preparing for washing.\n");
    machine->state = STATE_PREPARING;
}

// 准备状态下运行
static void preparing_run(WashingMachine *machine) {
    printf("Machine has started running.\n");
    machine->state = STATE_RUNNING;
}

// 运行状态下结束
static void running_end(WashingMachine *machine) {
    printf("Washing cycle completed.\n");
    machine->state = STATE_FINISHED;
}

// 初始化洗衣机状态及其对应的处理函数
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;
}

// 根据当前状态执行相应操作
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);

    // 根据实际需求调用操作函数
    operate_washing_machine(&machine, ACTION_PREPARE);
    operate_washing_machine(&machine, ACTION_RUN);
    operate_washing_machine(&machine, ACTION_END);

    return 0;
}

代码解释

代码示例展示了如何使用状态模式来模拟一个具有待机、准备、运行和结束四种状态的洗衣机设备。总结要点如下:

定义了WashingMachineState枚举类型,用于表示洗衣机的不同状态(待机、准备、运行和结束)。

定义了一个指向函数的指针类型StateMachineAction,该类型表示在不同状态下执行动作的函数指针。

创建了WashingMachine结构体,其中包含当前状态字段和三个函数指针成员,分别对应在不同状态下需要执行的动作。

定义了三个静态函数,分别是standby_prepare、preparing_run和running_end,这三个函数分别对应洗衣机从待机到准备、从准备到运行、从运行到结束状态的转换。

init_washing_machine函数用于初始化洗衣机对象,设置初始状态和对应状态下的动作函数。

operate_washing_machine函数根据当前洗衣机的状态执行相应的动作。在本示例中,动作的选择依赖于传入的action参数,但是实际上可能根据状态机的规则自行定义。

定义了宏ACTION_PREPARE、ACTION_RUN和ACTION_END,虽然在给出的代码片段中并未具体使用,但在实际应用中,这些宏或类似的常量可用于指示要执行的具体动作。

小结

本文通过状态模式分离了洗衣机状态的改变和对应状态下的行为,使得状态之间的转换变得清晰且易于维护。当状态变化时,只需调用相应状态下的动作函数即可完成状态的迁移和对应行为的执行。

相关推荐

  1. 嵌入开发状态模式实现

    2024-04-04 05:16:02       33 阅读
  2. 嵌入开发模板方法模式实现

    2024-04-04 05:16:02       36 阅读
  3. 嵌入开发观察者模式实现

    2024-04-04 05:16:02       44 阅读
  4. 嵌入开发装饰者模式实现

    2024-04-04 05:16:02       38 阅读
  5. Rust 嵌入开发

    2024-04-04 05:16:02       58 阅读
  6. rust嵌入开发

    2024-04-04 05:16:02       47 阅读
  7. 嵌入开发】29

    2024-04-04 05:16:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 05:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 05:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 05:16:02       82 阅读
  4. Python语言-面向对象

    2024-04-04 05:16:02       91 阅读

热门阅读

  1. 一些常见的jenkins问题和答案

    2024-04-04 05:16:02       31 阅读
  2. Springboot集成token认证

    2024-04-04 05:16:02       28 阅读
  3. C++基础语法、算法、数据结构的简化总结

    2024-04-04 05:16:02       49 阅读
  4. ClickHouse开发相关(UDAF)

    2024-04-04 05:16:02       35 阅读
  5. 优化 Nginx 处理 504 Gateway Timeout 错误

    2024-04-04 05:16:02       33 阅读