【C语言设计模式学习笔记1】面向接口编程/简单工厂模式/多态

面向接口编程可以提供更高级的抽象,实现的时候,外部不需要知道内部的具体实现,最简单的是使用简单工厂模式来进行实现,比如一个Sensor具有多种表示形式,这时候可以在给Sensor结构体添加一个enum类型的type,对外部来说都是使用通用的函数来获取相关的Sensor的值:

c 复制代码
typedef enum SensorType {
	SensorTypeForce,
	SensorTypePosition
}SensorType;
typedef struct Sensor
{
	SensorType type;
	float originalValue;
	float filteredValue;
} Sensor;
void SensorInit(Sensor* sensor_, SensorType type_);
{
	memset(sensor_, 0, sizeof(Sensor));
	sensor_->type= type_;
}
float Sensor_GetOriginalValue(Sensor* sensor_)
{
    switch(sensor_->type)
    {
		case SensorTypeForce:
			SensorForce_GetValue();
			break;
		case SensorTypePosition:
			SensorPosition_GetValue();
			break;
	}
	return sensor_->originalValue;
}

这样对于外部来说我们都只使用同样的接口就可以实现对各个传感器的值的采集。

进一步的,如果我们不想用switch-case分支来进行判断,我们可以往结构体Sensor里插入一个函数指针来指向获取传感器值的具体的函数,在初始化的时候就把函数指针赋值给Sensor结构体,类似于C++的多态:

c 复制代码
typedef struct Sensor
{
	float (*GetOriginalValue)(Sensor* sensor);
	float originalValue;
	float filteredValue;
} Sensor;
void SensorInit(Sensor* sensor_, float (*SensorGetOriginalValue_)(Sensor*))
{
	memset(sensor_, 0, sizeof(Sensor));
	sensor_->GetOriginalValue= SensorGetOriginalValue_;
}
float Sensor_GetOriginalValue(Sensor* sensor_)
{
	return sensor_->GetOriginalValue(sensor_);
}

只需要具体实现函数指针,获取传感器值的函数也不需要暴露给外部,可以在调用SensorInit的文件里同时定义SensorGetOriginalValue的具体实现函数,推荐定义为static函数,这样实现了函数的隐藏,实现了类似于C++的多态。

相关推荐
高晶4 小时前
ARM 嵌入式 Linux 系统启动流程实战指南
设计模式·程序员
Zwawa4 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·单片机·嵌入式
高晶4 小时前
BMS 通信开发实战:从 PMBus 协议到数据采集的完整指南
设计模式·程序员
geovindu4 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
电子IT笔记4 小时前
老MES登录改造:弱密码和暴破一起治
设计模式
牧瀬クリスだ6 小时前
单例模式终极指南:从入门到防破坏
单例模式·设计模式
Escalating_xu8 小时前
【C 语言】编译和链接:从源文件、目标文件到可执行程序完整解析
c语言·开发语言
C++ 老炮儿的技术栈8 小时前
std::atomic 是什么
linux·c语言·网络·c++·visual studio
Logic1019 小时前
C语言/数据结构位运算题解:异或XOR找出数轴移动中只出现一次的指令——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_462901979 小时前
CubeIDE串口重定向 printf
c语言