智能家居代码架构---简单工厂模式

news/2024/4/20 8:46:26/文章来源:https://blog.csdn.net/AuroraSmith/article/details/130307222

(11条消息) 智能家居 (10) ——人脸识别祥云平台编程使用(编译libcurl库支持SSL,安装SSL依赖库libssl、libcrypto)openssl 依赖库行稳方能走远的博客-CSDN博客

看上面这个博客的往期文章

代码设计经验的总结,稳定,拓展性更强。一系列编程思想 算法不是设计模式,因为算法致力于解决问题而非设计问题。

ftp get put cd lcd pwd lls ls.... 乱

什么是设计模式

设计模式通常描述了一组相互紧密作用的类与对象。(java) c 面向过程,一门不太友好的面向对象语言 java 面向对象

建筑设计领域引入到计算机科学中来的

23种 代码更容易被他人理解、保证代码可靠性、程序的重用性。 设计模式 | 菜鸟教程 (runoob.com) 百科 软件设计模式_百度百科 (baidu.com)

什么是类和对象

类是一种用户定义的引用数据类型,也称类类型。结构体 对象: 类的一种具象

struct Animal{ int age; int sex; //成员属性 void *peat(); void *pbeat(); //成员方法 }

struct Animal dog; struct Animal cat; struct Animal person;

什么是工厂模式

工厂模式(Factory Pattern)是最常用的设计模式之一。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的 (最 佳)方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

代码如下:

#include <stdio.h>struct Animal{char name[20];int sex;	//成员属性void (*peat)();//成员方法};void dogEat(void)
{printf("dog eats shit\n");
}
void catEat(void)
{printf("cat eats fish\n");
}
int main()
{struct Animal cat;struct Animal dog;cat.peat = catEat;dog.peat = dogEat;dog.peat();cat.peat();return 0;
}

更好的写法:

#include <stdio.h>struct Animal{char name[20];int sex;void (*peat)();};void dogEat(void)
{printf("dog eats shit\n");
}
void catEat(void)
{printf("cat eats fish\n");
}
int main()
{struct Animal cat = {.peat = catEat//选择性赋值};struct Animal dog = {.peat = dogEat};dog.peat();cat.peat();return 0;
}

工厂模式的实现

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;}
}

编译运行

如若想在链表上加入其它的animal,直接新建编写一个.C文件,然后加入到链表中。

这样就完成类似不断给智能家居加入新功能,同时也有助于代码的维护。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAX:概述ALL函数

简单的说&#xff0c;当ALL用作表函数时&#xff0c;忽略应用到表上的任何过滤器&#xff0c;并返回数据表&#xff1b;当ALL用作CALCULATE和CALCULATETABLE函数中修饰器时&#xff0c;ALL函数从扩展表中移除已经应用的过滤上下文。 注意自动存在(auto-eixist)对ALL()函数的影响…

选址-路径问题(Location-Routing Problem, LRP)

今天为大家介绍的是选址-路径问题(Location-Routing Problem, LRP)&#xff0c;首先上目录 目录 问题简介 基础模型、扩展问题及应用 算法 参考文献 1 问题简介 为了更好地了解这个问题&#xff0c;我们不妨当一波老板。 想象一下我们是经营一家口罩生产企业的老板&am…

案例——数据表的基本操作

目录 案例目的&#xff1a; 创建表&#xff1a; 创建offices&#xff1a; 创建employees表&#xff1a; 修改表&#xff1a; 将 employees 的 mobile 字段移动到 officeCode 字段后&#xff1a; 将 birth 字段名称改为 employee_birth: 修改 sex 字段&#xff0c;数据类…

Vue的路由实现:hash模式 和 history模式原理及区别

目录标题 1、hash模式2、history模式 Vue-Router有两种模式: ** hash 模式和 history**模式。默认的路由模式是hash模式。 1、hash模式 简介&#xff1a;hash模式是开发中默认的模式&#xff0c;它的URL带着一个#&#xff0c;例如:http://www.abc.com/#/vue&#xff0c;它的…

Facebook、Google、亚马逊,谁将成为跨境电商的营销宠儿?

跨境电商在全球范围内的发展日益迅猛&#xff0c;而营销渠道的选择也变得越来越多样化。在众多的广告平台中&#xff0c;Facebook、Google和亚马逊被公认为是跨境电商卖家们最主要的营销平台。那么&#xff0c;这三个平台中哪个会成为跨境电商的营销宠儿呢&#xff1f; 一、Fac…

【GIT】git push后长时间没反应

方向一 查看是否添加ssh 打开git bash cd ~/.ssh看是否成功&#xff0c;能成功说明之前生成过&#xff0c;看文件夹下是否有id_rsa.pub和id_rsa文件&#xff0c;有的话跳过生成步骤3 输入 ssh-keygen -t rsa -C ‘your_emailexample.com’(注&#xff1a;your_emailexample.c…

二百左右的蓝牙耳机哪款好?200左右音质最好的蓝牙耳机

在日常生活中离不开智能手机&#xff0c;特别是对无线蓝牙耳机的需求程度也越来越高&#xff0c;但是市面上有很多的蓝牙耳机戴久了耳朵会出现不舒服&#xff0c;为了获得更好的使用体验&#xff0c;我整理了市面上200左右价位佩戴和音质都表现不错的蓝牙耳机。 一、南卡小音舱…

“SCSA-T学习导图+”系列:IPSec VPN原理与应用

本期引言&#xff1a; 本章主要讲解IPSec VPN相关理论概念&#xff0c;工作原理。从安全和加密原理入手&#xff0c;讲解了IPSec 在VPN对等体设备实现的安全特性&#xff0c;如数据的机密性、数据的完整性&#xff0c;数据验证等。重点分析IPSec封装模式&#xff0c;IPSec安全…

【HDCTF2023】wp

【HDCTF2023】wp 文章目录 【HDCTF2023】wpwebWelcome To HDCTF 2023SearchMasterYamiYamiLoginMaster mischardMiscMasterMiscExtremeMiscSuperMisc web Welcome To HDCTF 2023 在源码的 game.js中找到了flag 在控制台输出 console.log(seeeeeeeecret)得flag SearchMaster …

亚马逊美国站带绳窗帘

带绳窗帘 如果您在亚马逊商城发布商品&#xff0c;则必须遵守适用于这些商品和商品信息的所有联邦、州和地方法律以及亚马逊政策&#xff08;包括本政策&#xff09;。 本政策涵盖的带绳窗帘 带绳窗帘是一种室内用窗帘&#xff0c;可通过一根吊绳控制升降。此类商品包括但不…

【PR 基础】轨道遮罩键、交叉溶解的简单使用

在上篇博客&#xff08;【PR 基础】裁剪工具的简单使用&#xff09;介绍了裁剪效果的使用&#xff0c;本篇博客在上篇的基础上继续添加 轨道遮罩键、交叉溶解的效果。 效果 步骤 1.可以先将恢复裁剪区域的关键帧删除 2. 接下来添加字幕&#xff0c;点击 新建-》旧版标题 点击…

vue3+ts+pinia+vite一次性全搞懂

vue3tspiniavite项目 一&#xff1a;新建一个vue3ts的项目二&#xff1a;安装一些依赖三&#xff1a;pinia介绍、安装、使用介绍pinia页面使用pinia修改pinia中的值 四&#xff1a;typescript的使用类型初识枚举 一&#xff1a;新建一个vue3ts的项目 前提是所处vue环境为vue3&…

flask学习-实践02

项目实战 入门文当(2条消息) python flask框架详解_flask python_尘世风的博客-CSDN博客(2条消息) python flask框架详解_flask python_尘世风的博客-CSDN博客 入门项目 抄作业了&#xff01;6 大 Flask 开源实战项目推荐_小詹学 Python的博客-CSDN博客 (66 条消息) GitHub 上有…

Transformer 位置编码代码解析

Transformer 位置编码代码解析 Transformer 的 Multi-Head-Attention 无法判断各个编码的位置信息。因此 Attention is all you need 中加入三角函数位置编码&#xff08;sinusoidal position embedding&#xff09;&#xff0c;表达形式为&#xff1a; P E ( p o s , 2 i ) …

OpenText Exceed TurboX (ETX) 安全功能介绍

OpenText Exceed TurboX (ETX) 安全功能介绍 将所有重要的知识产权&#xff08;IP &#xff09;相关数据保存在受良好保护的中央数据中心是保护 IP 的最佳做法。安全的远程访问是保护知识产权的关键。 所有数据流量均采用最新标准加密技术进行加密ETX 整合多种身份验证系统ET…

FE_TA不知道的CSS 换行系列【1】white-space

在W3C官方描述中&#xff0c;white-space主要有以下两个作用&#xff1a; 是否进行空格合并&#xff0c;以及控制空格合并的方式&#xff1b;是否在soft wrap opportunities&#xff08;文本中可进行换行的断点位置&#xff09;处进行文本换行。 从字面意思来看white-space即…

私人工具集6——使用C# 创建一个简单的restful风格的WebAPI

创建一个简单的WebApi 工具&#xff1a;VS2022 创建新项目 打开VS2022,创建新项目&#xff0c;可以搜索API作为关键字。 为项目取个名字 创建的应用程序&#xff0c;选择WebAPI&#xff0c;注意&#xff0c;右侧的信息默认即可&#xff0c;不要随意选择。 点击创建&#xff…

nodejs+vue 学分置换管理系统

在大学四年参加了各类竞赛后&#xff0c;我发现参加各类比赛存在报名过程过于繁琐&#xff0c;评比过程不透明和易出错等问题&#xff0c;所以在定题时与老师商讨后确定设计和实现基于nodejs的高校竞赛信息发布系统&#xff0c;帮助老师发布竞赛内容&#xff0c;便于同学们线上…

设计模式--建造者模式

项目需求 盖房需求 (1) 需要建房子:过程为 打地基 砌墙 封顶 (2) 房子有高正各样的,比如 平房和高楼 建房子的过程虽然都一样 但是要求不要相同的细节 传统方式 public abstract class TraditionBuild {//打地基public abstract void foundation();//砌墙public abstract voi…

不得不说的结构型模式-外观模式

目录 ​编辑 1. 什么是外观模式 1.1外观模式的结构&#xff1a; 2实际案例&#xff1a; 3下面是面试中关于装饰器模式的常见的问题&#xff1a; 3.1下面是问题的答案&#xff1a; 1. 什么是外观模式 Facade模式也叫外观模式, Facade模式为一组具有类似功能的类群&#xff…