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

news/2025/2/7 18:37:10/

面向接口编程可以提供更高级的抽象,实现的时候,外部不需要知道内部的具体实现,最简单的是使用简单工厂模式来进行实现,比如一个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.ppmy.cn/news/1570124.html

相关文章

Go基础之环境搭建

文章目录 1 Go 1.1 简介 1.1.1 定义1.1.2 特点用途 1.2 环境配置 1.2.1 下载安装1.2.2 环境配置 1.2.2.1 添加环境变量1.2.2.2 各个环境变量理解 1.2.3 验证环境变量 1.3 包管理工具 Go Modules 1.3.1 开启使用1.3.2 添加依赖包1.3.3 配置国内包源 1.3.3.1 通过 go env 配置1.…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

【AI】DeepSeek来了!!!

目录 1 DeepSeek简介 2 如何在本地环境中部署和运行 DeepSeek V3 模型? ■ 基本要求 ■ 代码和模型 ▲ 克隆仓库并安装依赖 ▲ 下载模型权重 ▲ 部署方案 1 DeepSeek简介 DeepSeek 在国产 AI 领域是一股清流。它专注于技术研发,以卓越的模型性能…

Docker 部署 GLPI(IT 资产管理软件系统)

GLPI 简介 GLPI open source tool to manage Helpdesk and IT assets GLPI stands for Gestionnaire Libre de Parc Informatique(法语 资讯设备自由软件 的缩写) is a Free Asset and IT Management Software package, that provides ITIL Service De…

C# Action和 Func的用法

C#中的数据类型 函数数据类型 Action 是一个数据类型 但是是没有返回值得函数数据类型 Func 用于指定一个有返回值的委托 internal class Program{static void Main(string[] args){TT.F1(NoVoid);TT.F2(Void1);Void2(() > { Console.WriteLine("Void2执行了");…

Unity Shader Graph 2D - 使用DeepSeek协助绘制一个爱心

最近十分流行使用DeepSeek AI,于是想尝试着能不能用DeepSeek来帮助我实现一些Shader Graph效果,正好之前看到了爱心图形,就说干脆用DeepSeek来告诉我怎么使用Shader Graph来绘制一个爱心。 问DeepSeek怎么绘制爱心 首先打开DeepSeek的网站&a…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中,对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像,每个像素点上的BGR值为三个整数,因为是三通道图像;对于灰度图像,各个像素上的BGR值是一个整数,因为这是单通…