12.设计模式-状态模式

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

需求

上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬。其实是一种状态的变化,不同的时间,会有不同的状态。你现在用代码来实现一下。

需求分析

  • 状态可能修改、增加、删除
  • 状态转移条件可能变化:该例中即时间

代码

状态处理

c 复制代码
typedef enum {
    MINSTATE,
    FORENOON,
    NOON,
    AFTERNOON,
    EVENING,
    SLEEPING,
    REST,
    MAXSTATE
} State;

typedef struct StateMove {
    State prev;
    State next;
    float hour;
    void (*handle)(struct StateMove *, struct StateMove *, char **words, float);
} StateMove;

void MoveHandle(StateMove *start, StateMove *obj, char **words, float workTime) {
    if(workTime < obj->hour) {
        printf("当前时间:%f点 %s\n", workTime, words[obj->prev]);
    }
    else {
        // 现在每一个状态只对应一个动作
        start[obj->prev].handle(start, &(start[obj->next]), words, workTime);
    }
}

客户端

支持修改点:1.状态打印 2.下一级动作和时间条件

注意不要修改后不要让状态死循环

c 复制代码
void PrintState(StateMove *move, char **words, float time) {
    move[0].handle(move, move, words, time);
}

int main() {
    // 状态
    char *words[] = {
        "上班前",
        "上午工作,精神百倍",
        "饿了,午饭,犯困,午休",
        "下午状态还不错,继续努力",
        "加班哦,疲累之极",
        "不行了,睡着了",
        "下班了"
    };
    // 状态转移
    StateMove move[] = {
        {MINSTATE, FORENOON, 9, MoveHandle},
        {FORENOON, NOON, 12, MoveHandle},
        {NOON, AFTERNOON, 13, MoveHandle},
        {AFTERNOON, EVENING, 17, MoveHandle},
        {EVENING, SLEEPING, 20, MoveHandle},
        {SLEEPING, REST, 22, MoveHandle}
    };
    float time;
    printf("请输入工作时间:\n");
    scanf("%f", &time);
    PrintState(move, words, time);
    return 0;
}

UML图

总结

  • 状态模式使用场景?
    "状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,那就没必要用'状态模式'了。"
相关推荐
Carl_奕然4 分钟前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
cfm_29146 分钟前
Spring核心设计模式
java·spring·设计模式
lincats20 小时前
大白话讲解Addy Osmani 的循环工程Loop Engineering工作流
人工智能·驱动开发·架构·prompt·状态模式·知识图谱
码匠许师傅1 天前
【设计模式精讲】15.享元模式(Flyweight)
c++·设计模式·享元模式·uml
事圆则缓1 天前
Android 常用设计模式速查
android·设计模式
MetaLite1 天前
Java通用枚举驱动下拉框-元数据接口与前端契约
java·前端·状态模式
码匠许师傅2 天前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
evans在进步2 天前
Java 常用设计模式(二):装饰器、适配器、责任链、模板方法、策略与观察者
java·开发语言·设计模式
骑士雄师2 天前
HITL = Human-in-the-Loop(人在回路中)
状态模式
码匠许师傅2 天前
【设计模式精讲】13.装饰器模式(Decorator)
c++·设计模式·uml·装饰器模式