什么是设计模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
设计模式通常描述了一组相互紧密作用的类与对象。(java)
c:面向过程,一种不太友好的面向对象语言
java:面向对象
建筑设计领域引入到计算机科学中来的
什么是类和对象
类:是一种用户定义的引用数据类型,也称类类型,结构体。
对象:类的一种具象。
#include <stdio.h>
struct Animal{
char name[128];
int age;
int sex;
int others;
void (*peat)();
void (*pbeat)();
void (*test)();
};
void dogEat()
{
printf("狗--dog\n");
}
void catEat()
{
printf("猫--cat\n");
}
void personEat()
{
printf("人吃米\n");
}
int main()
{
struct Animal dog = {
.peat = dogEat,
};
struct Animal cat = {
.peat = catEat
};
struct Animal person = {
.peat = personEat
};
dog.peat();
cat.peat();
person.peat();
return 0;
}
工厂模式概念引入
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
下面是基于C实现的工厂模式
Animal.h
#include <stdio.h>
struct Animal
{
char name[128];
int age;
void (*peat)();
void (*pbeat)();
struct Animal *next;
};
struct Animal* putCatLink(struct Animal *phead);
struct Animal* putDogInLink(struct Animal *phead);
struct Animal *putPersonInLine(struct Animal *head);
cat.c
#include "Animal.h"
void catEat()
{
printf("cat eat fish\n");
}
void catBeat()
{
printf("cat beat your brother\n");
}
struct Animal cat = {
.name = "Tom",
.peat = catEat,
.pbeat = catBeat
};
struct Animal* putCatLink(struct Animal *phead)
{
if(phead == NULL){
phead = &cat;
}else{
cat.next = phead;
phead = &cat;
}
return phead;
}
dog.c
#include "Animal.h"
void dogEat()
{
printf("dog eat shit\n");
}
void dogBeat()
{
printf("dog bite your litter brother\n");
}
struct Animal dog = {
.name = "huang",
.peat = dogEat,
.pbeat = dogBeat
};
struct Animal* putDogInLink(struct Animal *phead)
{
if(phead == NULL){
phead = &dog;
}else{
dog.next = phead;
phead = &dog;
}
return phead;
}
person.c
#include "Animal.h"
void personEat()
{
printf("person eat meat\n");
}
void personBeat()
{
printf("person beaat eachother\n");
}
struct Animal person = {
.name = "dzz",
.peat = personEat,
.pbeat = personBeat
};
struct Animal *putPersonInLine(struct Animal *head)
{
if(head == NULL)
{
head = &person;
}else
{
person.next = head;
head = &person;
}
return head;
}
mainpro.c
#include "Animal.h"
#include <string.h>
struct Animal* findUtilByName(char *str, struct Animal *pthead)
{
struct Animal *p = pthead;
if(p == NULL){
printf("error in link\n");
return NULL;
}else{
while(p != NULL){
if(strcmp(str, p->name) == 0){
return p;
}
p = p->next;
}
return NULL;
}
}
int main()
{
char buf[128] = {'\0'};
struct Animal *phead = NULL;
struct Animal *ptmp = NULL;
phead = putCatLink(phead);
phead = putDogInLink(phead);
phead = putPersonInLine(phead);
phead = putMaLink(phead);
while(1){
printf("Input: Tom, huang, ma, dzz\n");
scanf("%s", buf);
ptmp = findUtilByName(buf, phead);
if(ptmp != NULL){
ptmp->pbeat();
ptmp->peat();
}
memset(buf, '\0', sizeof(buf));
}
return 0;
}
编译:
gcc *.c