智能家居代码机构——简单工厂模式:
算法: 算法不是设计模式,因为算法致力于解决问题而非设计问题,设计模式通常描述了一组相互紧密作用的类与对象。
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.c这个文件就是存放dog这个对象的相关行为,并且提供让主程序调用的函数API将dog这个对象添加到链表中去(这个就像是以后的智能家居为实现整个控制系统,需要添加的各个功能模块,一个供能模块就是一个文件),putdogLink 是将dog对象插入进链表的API接口,这里采用头插法进行插入,即:先插入的在后边。
所有代码最好在Source Insight下编写,并将所有代码进行关联,方便读写。
#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);
#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;
}
#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; //返回最新的头
}
}
#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;
}
}
#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文件,然后加入到链表中。
这样就完成类似不断给智能家居加入新功能,同时也有助于代码的维护。