当前位置: 首页 > article >正文

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

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

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++的多态:

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++的多态。


http://www.kler.cn/a/530430.html

相关文章:

  • Shadow DOM举例
  • 基于密度泛函理论研究二维材料掺杂前后光电性能变化的模拟项目规划
  • 索罗斯的“反身性”(Reflexivity)理论:市场如何扭曲现实?(中英双语)
  • 分布式事务组件Seata简介与使用,搭配Nacos统一管理服务端和客户端配置
  • 此虚拟机的处理器所支持的功能不同于保存虚拟机状态的虚拟机的处理器所支持的功能
  • AIGC技术中常提到的 “嵌入转换到同一个向量空间中”该如何理解
  • MATLAB中open函数用法
  • 一文总览OpenAI o1相关的技术:从CoT、Quiet-STaR、Self-Correct、Self-play RL、MCTS等到类o1模型rStar-Math
  • 在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用
  • 想品客老师的第十天:类
  • DeepSeek技术深度解析:从不同技术角度的全面探讨
  • 软件工程概论试题三
  • MATLAB中savefig函数用法
  • python激活shizuku
  • 解决whisper 本地运行时GPU 利用率不高的问题
  • 学习日记-250202
  • 代码随想录刷题笔记
  • 信息学奥赛一本通 1422:【例题1】活动安排
  • Vue.js 的介绍与组件开发初步
  • CSS Display属性完全指南
  • Shell基础:中括号的使用
  • React基础知识回顾详解
  • Java基础知识总结(三十九)--File类
  • 常见计算机视觉算法介绍
  • 全面解析机器学习优化算法中的进化策略
  • Baklib如何改变内容管理平台的未来推动创新与效率提升