嵌入式设计模式基础--C语言的继承封装与多态

嵌入式设计模式--C语言的简单工厂模式

嵌入式设计模式--C语言的抽象工厂模式

嵌入式设计模式--C语言的建造者模式

嵌入式设计模式--C语言的观察者模式

嵌入式设计模式--C语言的原型模式

嵌入式设计模式--C语言的桥接模式

嵌入式设计模式--C语言的中介者模式

嵌入式设计模式--C语言的装饰器模式

嵌入式设计模式--C语言的外观模式

嵌入式设计模式--C语言的解释器模式

嵌入式设计模式--C语言的享元模式

嵌入式设计模式--C语言的代理模式

嵌入式设计模式--C语言的模板方法模式

备忘录模式×C语言:嵌入式开发进阶

嵌入式设计模式--C语言的迭代器模式

本期我们要更新的是行为型设计模式--状态(机)模式。

什么是状态模式?

根据GoF《设计模式》原著,状态模式(State Pattern)的核心意图:

"Allow an object to alter its behavior when its internal state changes. The object will appear to change its class."

中文含义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

为什么需要状态模式?

状态模式解决了传统状态机实现中代码难以维护、扩展困难的核心痛点,通过将状态封装为独立对象,实现行为与状态的绑定,让状态转移清晰化、系统可扩展化。

传统软件编码的困境

  • 分支复杂

if-else与switch-case随状态数激增,函数冗长,圈复杂度过高。

  • 职责混乱

上下文持有所有状态行为,修改易引入回归Bug。

  • 扩展僵化

新增状态需改现有代码,违反开闭原则,迭代风险高。

状态模式的三重解耦

  • 行为与状态绑定

状态对象自主实现行为,上下文通过多态分发调用,消除条件判断。

  • 转移逻辑自治

状态内部决定"事件→下一状态",避免集中式转移表臃肿。

  • 上下文精简

仅维护current_state指针,行为全部委托,代码量降70%+。

核心角色
打开网易新闻 查看精彩图片
核心角色

上下文(Context)

持有当前状态对象的引用,定义客户端使用的主要接口。所有与状态相关的行为请求都委托给当前状态对象处理,自身不直接实现状态逻辑,只负责状态切换时的对象替换。

  • 抽象状态(State)

定义状态接口,声明与上下文特定状态相关的行为方法。作为所有具体状态的公共规范,确保状态对象可以互相替换,使上下文能以统一方式调用不同状态的行为。

  • 具体状态(ConcreteState)

实现抽象状态接口,封装上下文在该状态下的具体行为规则和状态转移条件。每个具体状态类只关注自身状态下的操作逻辑,并决定何时以及切换到哪个下一个状态。

核心思想

状态模式将状态封装为独立的类,把与状态相关的行为分散到各个状态类中。当对象的状态改变时,其行为也随之改变,无需使用大量的条件判断语句(if-else 或 switch-case)

UML示例
打开网易新闻 查看精彩图片
UML示例

Context 通过 state 字段关联抽象 State,而非直接关联具体状态

  • 具体状态 既实现 State 接口,又依赖 Context(通过参数传入),以便在条件满足时触发状态转移

  • 状态转换可由 Context 控制(外部驱动),也可由 ConcreteState 自身控制(满足条件后主动申请切换),后者更常见

  • 举个例子

    下面我们给到一个简单的电机控制的例子来展示状态模式。

    核心体现

    • 无 switch-case:

      main 只调用 motor_request,行为完全由当前状态对象决定

    • 自驱动转移:各状态类内部判断切换条件(如 startingState 检测到速达目标后主动申请切运行态)

    • 新增状态易扩展:增加新状态只需新建结构体,不改动现有状态代码

    打开网易新闻 查看精彩图片
    抽象状态
    打开网易新闻 查看精彩图片
    上下文
    打开网易新闻 查看精彩图片
    具体状态--停止状态具体状态--启动状态
    打开网易新闻 查看精彩图片
    具体状态--运行状态
    打开网易新闻 查看精彩图片
    具体状态--减速停止状态
    打开网易新闻 查看精彩图片
    具体实现
    • 运行日志:

    === 启动到1000转 ===

    状态切换: 停止 -> 启动

    启动中: 转速=100

    启动中: 转速=200

    启动中: 转速=1000

    状态切换: 启动 -> 运行

    === 目标改为0转(停机)===

    状态切换: 运行 -> 减速

    减速中: 转速=900

    减速中: 转速=0

    状态切换: 减速 -> 停止

    ==== 停止 ====

    状态机总结
    打开网易新闻 查看精彩图片
    状态机总结

    状态模式

    允许对象在内部状态改变时改变其行为,将状态封装为独立类,分散状态相关行为,避免冗长的条件分支。

    核心角色包括:上下文维护当前状态并委托行为,抽象状态定义接口规范,具体状态实现特定行为并控制状态转移。其优势在于消除复杂条件判断、集中状态逻辑、显式化转换规则,支持通过新增状态类扩展系统。

    在嵌入式开发中,该模式

    广泛应用于协议解析、电源管理、电机控制等场景。通过函数指针模拟状态接口,既保留封装性与可扩展性,又避免动态内存开销

    ,是资源受限环境下实现清晰状态机的经典方案。