智能家居项目开发准备工作
创始人
2024-01-25 19:05:28

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

  • 什么是设计模式?
    百度百科解释: 软件设计模式(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 
//类 :抽象  模板
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 
//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 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 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文件,然后加入到链表中。
这样就完成类似不断给智能家居加入新功能,同时也有助于代码的维护。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
超纤皮是什么皮 超纤皮好不好 相信大家买车的时候,很多人都会选择皮座椅,因为不但有档次,而且手感也会比织物的好。但是大家想过没有,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
超纤皮是什么皮 超纤皮好不好 相信大家买车的时候,很多人都会选择皮座椅,因为不但有档次,而且手感也会比织物的好。但是大家想过没有,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...