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语言实现源码