目录
- 设计模式的概念引入
- 工厂模式的实现
- animal.h
- mainPro.c
- cat.c
- dog.c
- person.c
- 工厂模式的功能验证
- 往期文章
设计模式的概念引入
工厂模式的实现
所有代码最好在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文件,然后加入到链表中。
这样就完成类似不断给智能家居加入新功能,同时也有助于代码的维护。
往期文章
智能家居 (1) ——智能家居整体功能框架
智能家居 (2) ——设计模式的引入
智能家居 (3) ——工厂模式继电器控制灯
智能家居 (4) ——工厂模式火焰报警
智能家居 (5) —— LD3320语音模块二次开发
智能家居 (6) ——语音识别线程控制
智能家居 (7) ——网络服务器线程控制
智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)
网络编程知识预备(1) ——了解OSI网络模型
网络编程知识预备(2) ——浅显易懂的三次握手与四次挥手
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(4) ——了解HTTP协议与HTTPS协议
网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
智能家居 (9) ——人脸识别摄像头安装实现监控功能
智能家居 (10) ——人脸识别祥云平台编程使用
智能家居 (11) ——树莓派摄像头捕捉人脸并识别
智能家居 (12) ——人脸识别整合到智能家居系统
智能家居 (13) ——智能家居加入手机app端控制