ESC
输入关键词搜索文章标题和内容

C语言实现行为型模式:备忘录、状态、访问者、中介者、解释器

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

C语言实现行为型模式:备忘录、状态、访问者、中介者、解释器

导读:本文介绍行为型设计模式最后5种:备忘录、状态、访问者、中介者、解释器。掌握这5种模式,即可完成23种设计模式的完整学习。


一、原理简析

行为型模式最后5种分别从状态保存、状态机、数据操作分离、星型通信、语言解析角度解决特定问题。

五种模式对比:

模式 核心作用 解决问题
备忘录 状态快照 保存恢复状态
状态 状态切换 状态机实现
访问者 数据操作分离 操作可扩展
中介者 星型通信 解耦对象间通信
解释器 语言解析 文法解释执行

二、实操步骤

2.1 备忘录模式:状态快照

#include <stdio.h>
#include <string.h>

typedef struct Memento {
    char state[20];
} Memento;

typedef struct Originator {
    char state[20];
    Memento* (*Save)(struct Originator*);
    void (*Restore)(struct Originator*, Memento*);
} Originator;

static Memento saved;

Memento* OriginatorSave(Originator* o) {
    strcpy(saved.state, o->state);
    printf("保存状态:%s\n", saved.state);
    return &saved;
}

void OriginatorRestore(Originator* o, Memento* m) {
    strcpy(o->state, m->state);
    printf("恢复状态:%s\n", o->state);
}

2.2 状态模式:状态机实现

#include <stdio.h>

typedef struct State {
    void (*Handle)(void);
    const char* name;
} State;

void FreeHandle(void) { printf("空闲状态\n"); }
void BusyHandle(void) { printf("忙碌状态\n"); }
void StopHandle(void) { printf("停止状态\n"); }

int main(void) {
    State freeState = {FreeHandle, "空闲"};
    State busyState = {BusyHandle, "忙碌"};

    State* current = &freeState;
    current->Handle();

    current = &busyState;
    current->Handle();

    return 0;
}

2.3 中介者模式:星型通信

#include <stdio.h>

typedef struct Mediator;
typedef struct Colleague {
    const char* name;
    struct Mediator* mediator;
    void (*Send)(struct Colleague*, const char*);
} Colleague;

typedef struct Mediator {
    void (*Notify)(struct Mediator*, Colleague*, const char*);
} Mediator;

void ColleagueSend(Colleague* c, const char* msg) {
    printf("[%s] 发送:%s\n", c->name, msg);
    c->mediator->Notify(c->mediator, c, msg);
}

void MediatorNotify(Mediator* m, Colleague* from, const char* msg) {
    printf("[中介者] 转发 from [%s]:%s\n", from->name, msg);
}

三、对比表格

备忘录模式
状态快照 | 保存恢复 | 封装性保持
↓
状态模式
状态切换 | 自动行为变化 | 状态机
↓
访问者模式
数据操作分离 | 新操作易扩展 | 双重分派
↓
中介者模式
星型通信 | 网状转星型 | 解耦同事

四、核心流程图

flowchart TB subgraph 行为型下["行为型模式(下)"] A["备忘录<br/>状态快照"] B["状态模式<br/>状态切换"] C["访问者<br/>数据操作分离"] D["中介者<br/>星型通信"] E["解释器<br/>语言解析"] end A --> B --> C --> D --> E

五、23种设计模式总结

分类总览

类别 数量 模式
创建型 5 单例、工厂、抽象工厂、建造者、原型
结构型 7 适配器、桥接、装饰器、组合、外观、享元、代理
行为型 11 策略、模板、观察者、迭代器、责任链、命令、备忘录、状态、访问者、中介者、解释器

C语言实现核心技巧

技巧 作用
函数指针 模拟方法调用
结构体嵌套 实现继承
函数指针数组 实现多态
static/malloc 管理对象生命周期

六、总结

本文完成了23种设计模式在C语言中实现的完整系列。通过struct+函数指针,我们可以在C语言中优雅地模拟面向对象特性,实现所有经典设计模式。

来自 linuxros.cn · linuxROS

核心要点:
- 备忘录:状态快照与恢复
- 状态:状态机自动切换
- 访问者:数据与操作分离
- 中介者:星型通信解耦
- 解释器:简单文法解析

掌握这23种模式,你的设计能力将得到质的提升!


关注公众号:linuxros
回复「设计模式」,获取完整23种设计模式C语言实现源码


程序员

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页