智能家居项目开发准备工作

news2024/11/21 2:32:22

智能家居代码机构——简单工厂模式:

  • 什么是设计模式?
    百度百科解释: 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。                                                              总的来说: 就是代码设计经验的总结,能够让代码稳定,拓展性更强,一系列编程的思想,代码容易被他人理解,保证代码可靠性,程序的重用性。设计模式有23种,要慢慢的积累,使用设计模式会增强代码的稳定性,在代码里面添加某些功能不会将代码其他部分的功能破坏掉。
  • 算法: 算法不是设计模式,因为算法致力于解决问题而非设计问题,设计模式通常描述了一组相互紧密作用的类与对象。

C语言面向对象引入类和对象的概念:

  • 类: 类是一种用户定义的引用数据类型,也称类类型。(在C语言中和结构体差不多)
  • 对象: 对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。它们的关系是:对象是类的实例,类是对象的模板。

程序举例:

struct Animal
{
	char [128];
	int age;
	int sex;//成员属性
	void (*peat)();
	void (*pbeat)();//成员方法
}
struct Animal dog; 
struct Animal cat;//dog cat 是类(Animal)的一种对象

 C语言面向对象举例:

#include <stdio.h>
//类 :抽象  模板
struct Animal
{
	char name[128];
	int age;
	int sex;//成员属性
	void (*peat)();
	void (*pbeat)();//成员方法,这里是函数指针类型。
};
void dogEat()
{
	printf("eat  meat\n");
}
void catEat()
{
	printf("ear fish\n");
}
void dogBeat()
{
	printf("咬\n");
}
void catBeat()
{
	printf("抓\n");
}
int int main()
{
	struct  Animal dog; 
	struct Animal cat;//dog cat 是类(Animal)
	dog.peat=dogEat;
	cat.peat =catEat;
	dog.pbeat=dogBeat;
	cat.pbeat=catBeat;//函数名相当于指针

	dog.peat();
	dog.pbeat();
	cat.peat();
	cat.pbeat();
	return 0;
}

 C结构体的另一种使用方法(在前面驱动代码的编写中使用过):

#include <stdio.h>
//l类 :抽象  模板
struct Animal
{
	char name[128];
	int age;
	int sex;//成员属性
	void (*peat)();
	void (*pbeat)();//成员方法
};
void dogEat()
{
	printf("eat  meat\n");
}
void catEat()
{
	printf("ear fish\n");
}
void dogBeat()
{
	printf("咬\n");
}
void catBeat()
{
	printf("抓\n");
}
int main()
{
	struct Animal dog1={"阿黄",11,20,dogEat,dogBeat};//这是之前的写法,必须按照顺序来
	//下面是新的写法,可以选择性的为模板里面的元素赋值
	struct  Animal dog={
		.pbeat=dogBeat,
		.peat=dogEat
	} ;
	struct  Animal cat={
		.pbeat=catBeat,
		.peat=catEat
	} ;
	//结构体新的用法
	dog.peat();
	dog.pbeat();
	cat.peat();
	cat.pbeat();
	return 0;
}

什么是工厂模式:

工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不辑会对客户端暴露创建逻,并且是通过使用一个共同的接口来指向新创建的对象。下面通过软件将以上代码采用简单工厂模式在sourceInsight里面进行编写,以下是简单工厂模式的示例,工厂模式使代码逻辑和思路更加清晰,便于修改和添加。

  •      首先在选定位置新建一个文件夹,然后在文件夹里面新建dog.canimal.hcat.cmianpro.c 然后再新建一个文件夹存放sourceInsight的工程文件(有关sourceInsight的用法),如下图所示:

然后将对应的代码写入对应的文件,比如:dog.c这个文件就是存放dog这个对象的相关行为,并且提供让主程序调用的函数API将dog这个对象添加到链表中去(这个就像是以后的智能家居为实现整个控制系统,需要添加的各个功能模块,一个供能模块就是一个文件),putdogLink 是将dog对象插入进链表的API接口,这里采用头插法进行插入,即:先插入的在后边。


               所有代码最好在Source Insight下编写,并将所有代码进行关联,方便读写

animal.h

#include <stdio.h>


struct Animal{
		char name[128];
		int  age;
		int  sex;
		int  others;
		void (*peat)();
		void (*pbeat)();
		void (*test)();

		struct Animal *next;

};

struct Animal* putPersonInLink(struct Animal *phead);//先声明
struct Animal* putCatInLink(struct Animal *phead);
struct Animal* putDogInLink(struct Animal *phead);

 mainPro.c

#include "animal.h"
#include <string.h>

struct Animal* findUtilByName(char* str, struct Animal* phead)//结构体查询
{
	struct Animal *tmp= phead;

	if(phead== NULL){
		printf("空\n");
		return NULL;
	}else{
		while(tmp != NULL){
			if(strcmp(tmp->name,str) == 0){
				return tmp;
			}
			tmp=tmp->next;
		}
		return NULL;
	}
}

int main()
{
	char buf[128]={'\0'};
	struct Animal *phead = NULL;
	struct Animal *ptmp;

	phead = putCatInLink(phead);
	phead = putDogInLink(phead);
	phead = putPersonInLink(phead);//至此已经组合完成整个链表

	
	while(1){
		printf("please input:Tom,ahuang, xiaoming\n");  //链表的查询
		scanf("%s",buf);
		ptmp = findUtilByName(buf,phead);

		if(ptmp != NULL){
		ptmp->pbeat();
		ptmp->peat();
		}
		memset(buf, '\0',sizeof(buf)); //此处不能用strlen
	}

	return 0;
}

 cat.c

#include "animal.h"

void catEat()
{
	printf("cat eat fish\n");
}

void catBeat()
{
	printf("cat bite your little brother\n");
}

struct Animal cat = {
	.name = "Tom",
	.peat = catEat,
	.pbeat = catBeat

};


struct Animal* putCatInLink(struct Animal *phead)
{
	if(phead == NULL){
		phead = &cat;
		return phead;
	}else{
		cat.next = phead;  //头插法
		phead = &cat;
		return phead;     //返回最新的头
		
	}
}

dog.c

#include "animal.h"

void dogEat()
{
	printf("dog eat shi\n");
}

void dogBeat()
{
	printf("dog bite your little brother\n");
}

struct Animal dog = {
	.name = "ahuang",
	.peat = dogEat,
	.pbeat = dogBeat

};


struct Animal* putDogInLink(struct Animal *phead)
{
	if(phead == NULL){
		phead = &dog;
		return phead;
	}else{
		dog.next = phead;
		phead = &dog;
		return phead;
		
	}
}

person.c

#include "animal.h"

void personEat()
{
	printf("person eat rice\n");
}

void personBeat()
{
	printf("person bite  your brother\n");
}
  
struct Animal person = {
	.name = "xiaoming",
	.peat = personEat,
	.pbeat = personBeat

};


struct Animal* putPersonInLink(struct Animal *phead)
{
	if(phead == NULL){
		phead = &person;
		return phead;
	}else{
		person.next = phead;
		phead = &person;
		return phead;
		
	}
}

工厂模式的功能验证

将上述代码放到ubuntu下运行,效果如下:

 用Source Insight编写代码会有一些编码格式问题,拿过来放到ubuntu上运行会出现乱码,最好不要有中文。

如若想在链表上加入其它的animal,直接新建编写一个.C文件,然后加入到链表中。
这样就完成类似不断给智能家居加入新功能,同时也有助于代码的维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

好心情精神心理平台:精神疾病怎样才算「治好」?医生和患者眼中的标准不一样!

精神疾病恢复到什么程度才算「治好」了&#xff1f; 很多患者朋友认为&#xff0c;症状消失就代表病好了&#xff0c;就可以停药了。 不是我吓唬你&#xff0c;如果你见症状好转就停药&#xff0c;那病情出现反复是必然结果。 实现疾病症状的消除&#xff0c;这只是达到了「临…

[附源码]java毕业设计驾校管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计基于的疫苗预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

详解VSCode中C++工程配置

安装MinGW-w64及环境变量配置 下载MinGW-w64 可以通过官网直接进行下载在线安装包&#xff0c;然后在本地进行安装即可&#xff08;但是基本都会由于网络超时等各种原因终止&#xff09;。 因此这里建议直接下载 MinGW-w64 库解压&#xff0c;然后在系统中指定环境变量即可。…

低资源场景下的命名实体识别

Overview 低资源下的命名实体识别主要分为两个方面&#xff0c;一种是in-domain下的N-way-K-shot类型的少样本&#xff0c;一种是cross-domain下现在资源丰富的sourc-domain上进行微调&#xff0c;之后再迁移到低资源的target-domain进一步微调。 基于prompt的方法在少样本分…

C语言学习-数组(4)

目录 思维导图&#xff1a; 1. 一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存…

C# async / await 的使用方法

目录 一、简介 二、异步等待返回结果 三、异步方法的返回类型 四、await foreach 五、Task.Delay 结束 一、简介 await 运算符暂停对其所属的 async 方法的求值&#xff0c;直到其操作数表示的异步操作完成。 异步操作完成后&#xff0c;await 运算符将返回操作的结果&a…

【Xilinx】Zynq\MPSoc\Versal不同速度等级下的ARM主频

【Xilinx】Zynq\MPSoc\Versal不同速度等级下的ARM主频一、Zynq&#xff08;A9&#xff09;二、MPSoC(A53R5)三、Versal(A72R5F)最近有很多人在选型的时候&#xff0c;问到ARM主频的问题&#xff0c;不知道去哪里找这个参数。 授人以鱼不如授人以渔&#xff0c;基本的通用方法是…

【面试题】 TypeScript 前端面试题 由浅到深

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 基本类型介绍 1.Boolean&#xff0c;Number&#xff0c;String 声明:类型 类型对应变量 let flag:boolean true let …

【现代密码学原理】——哈希函数(学习笔记)

&#x1f4d6; 前言&#xff1a;我们在登录QQ有时会遇到密码忘记的问题&#xff0c;那么思考一下&#xff0c;为什么腾讯公司不直接把密码发还给用户而是要求设置新密码呢。其实&#xff0c;不保存密码&#xff0c;是为了更好地对密码保密&#xff0c;换言之&#xff0c;腾讯的…

力扣(LeetCode)106. 从中序与后序遍历序列构造二叉树(C++)

递归 如图&#xff0c;后序序列按照左右根遍历&#xff0c;所以根在最后。逆着后序遍历的顺序&#xff0c;按照根右左递归建树就可以复原这棵树。后序序列&#xff0c;可以确定根的位置 postrootpostrootpostroot 和根结点的值。我们在中序序列找到根结点的值&#xff0c;就确定…

《深度学习进阶 自然语言处理》第四章:Embedding层和负采样介绍

文章目录4.1 word2vec的改进一4.1.1 Embedding层4.2 word2vec的改进二4.2.1 中间层之后的计算问题4.2.2 从多分类到二分类4.2.3 负采样总结之前文章链接&#xff1a; 开篇介绍&#xff1a;《深度学习进阶 自然语言处理》书籍介绍 第一章&#xff1a;《深度学习进阶 自然语言处…

想知道有没有拍照转文字的软件?这3款工具职场人士必备

你们在工作上有没有遇到这种情况&#xff0c;就是领导突然甩一份纸质文件给你&#xff0c;并要求整理成电子版&#xff0c;供其他同事查阅。回想我当初刚踏入职场时&#xff0c;没有什么工作经验&#xff0c;只会对照着内容手动码字输出&#xff0c;但是太浪费时间了&#xff0…

湖北银行冲刺上市:不良率高于行业均值,有公司欠5亿元未能追回

撰稿|汤汤 来源|贝多财经 最近&#xff0c;湖北银行正式向A股递交申请材料&#xff0c;准备在上海证券交易所上市。 据贝多财经了解&#xff0c;湖北银行股份有限公司&#xff08;下称“湖北银行”&#xff09;于2022年11月4日在证监会预披露招股书&#xff0c;计划在上交所…

Azide-PEG-Aldehyde,N3-PEG-ALD,叠氮-PEG-醛基可用于新材料研究

化学试剂叠氮-聚乙二醇-醛基&#xff0c;其英文名为Azide-PEG-Aldehyde&#xff08;N3-PEG-ALD&#xff09;&#xff0c;它所属分类为Aldehyde / Acetal PEG Azide PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;5000 N3-PEG-ALD、10000 叠氮-PEG-醛基、1000 N3-PE…

短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

SpringMVC 请求流程源码分析

三哥 内容来自【自学星球】 欢迎大家来了解我的星球&#xff0c;和星主&#xff08;也就是我&#xff09;一起学习 Java &#xff0c;深入 Java 体系中的所有技术。我给自己定的时间是一年&#xff0c;无论结果如何&#xff0c;必定能给星球中的各位带来点东西。 想要了解更多&…

使用robot+selenium创建一个UI自动化测试用例

新建项目并安装robotframework pip install robotframework 在pycharm-插件&#xff0c;输入robot搜索插件 选择Robot Framework Language Server或者Hyper RobotFramework Support安装 新建test.robot文件编写测试用例test.robot robot用例文件通常包括4个头部分&#xf…

Substance Painter 的一些玩法笔记

Substance Painter 的一些玩法 1、模型边缘磨损效果&#xff1a; 参考连接&#xff1a;Substance Painter 后期添加法线贴图&#xff0c;处理边缘磨损&#xff01;_哔哩哔哩_bilibili 使用方法&#xff1a; 1、导入要处理的模型文件 2、烘焙 模型贴图(主要是法线) 3、创建一个…

接口api 之Swagger 一次实战探索

今天我们来说说什么是Swagger&#xff1f; 就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述文件可以去更新接口文档&#xff0c;以及生成各端代码。而Springfox-swagger,则可以通过扫描代码去生成这个描述文…