軟體設計模式,又稱設計模式,是一套被反複使用,多數人知曉的,經過分類編目的。代碼設計經驗的總結。使用設計模式是為了可重用代碼,讓代碼更容易被他人了解,保證代碼可靠性,程式的重用性。設計模式一共有23種。算法不是設計模式,因為算法緻力于解決問題而非設計問題。
設計模式通常描述了一組互相緊密作用的類與對象,c面向過程,是一門不太友好的面向對象的語言,java面向對象。
什麼是類與對象?
類是一種使用者定義的引用資料類型,也稱類類型。類是一種抽象的概念,每個類包含資料說明和一組操作資料或傳遞消息的函數,對象是類的一種具體的實列。
例如:
類:struct Animal {
char name [128];
int age;
int sex;
void (*peat)();
void (*pbeat)();
}
對象:
struct Animal dog;
struct Animal cat;
struct Anima person;
什麼是工廠模式?
工廠模式(Factory Pattern)是最常用的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
在工廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,并且是通過使用一個共同的接口來指向新建立的對象。
例如:
Animal.h檔案如下:
1 #include <stdio.h>
2
3 struct Animal {
4
5 char name [128];
6 int age;
7 int sex;
8 void (*pbeat)();
9 void (*peat)();
10
11 struct Animal *next;
12
13 };
14
15
16 struct Animal *putdogintolink(struct Animal *phead);
17 struct Animal *putcatintolink(struct Animal *phead);
18 struct Animal *putpersonintolink(struct Animal *phead);
cat.c檔案如下:
1 #include "Animal.h"
2
3
4 void catBeat()
5 {
6 printf("貓抓撓\n");
7
8 }
9 void catEat()
10 {
11 printf("貓吃魚\n");
12 }
13
14
15
16
17 /*對象 “貓” */
18 struct Animal cat = {
19
20 .name = "Tom",
21 .age = 10,
22 .pbeat = catBeat,
23 .peat = catEat
24
25
26 };
27
28 /*插傳入連結表函數*/
29 struct Animal *putcatintolink(struct Animal *phead)
30 {
31 if(phead == NULL)
32 {
33 return &cat;
34 }
35 else
36 {
37 cat.next = phead;
38 phead = &cat;
39
40 return phead;
41 }
42
43 }
dog.c檔案如下:
1 #include "Animal.h"
2
3
4
5 void dogBeat()
6 {
7 printf("狗撕咬\n");
8 }
9
10
11 void dogEat()
12 {
13 printf("狗吃剩飯\n");
14 }
15
16
17
18 /*對象 “狗” */
19 struct Animal dog ={
20
21 .name = "xiaohui",
22 .age = 5,
23 .pbeat =dogBeat,
24 .peat = dogEat,
25
26
27
28 };
29
30 /*插傳入連結表函數*/
31 struct Animal *putdogintolink(struct Animal *phead)
32 {
33 if(phead == NULL)
34 {
35 return &dog;
36 }
37 else
38 {
39 dog.next = phead;
40 phead = &dog;
41
42 return phead;
43 }
44 }
person.c檔案如下:
1 #include "Animal.h"
2
3
4 void personBeat()
5 {
6 printf("人用武器\n");
7 }
8
9 void personEat()
10 {
11 printf("人吃飯\n");
12 }
13
14
15
16
17 /* 對象 “人” */
18 struct Animal person ={
19
20 .name = "xiaoming",
21 .age = 25,
22 .pbeat = personBeat,
23 .peat = personEat
24
25 };
26
27 /*插傳入連結表函數*/
28 struct Animal *putpersonintolink(struct Animal *phead)
29 {
30 if(phead == NULL)
31 {
32 return &person;
33 }
34 else
35 {
36 person.next = phead;
37 phead = &person;
38
39
40 return phead;
41 }
42
43 }
main.c檔案如下:
1 #include "Animal.h"
2 #include <string.h>
3
4
5 /*擷取目标對象函數*/
6 struct Animal *getDes(char *name,struct Animal *phead)
7 {
8 struct Animal *temp = phead;
9
10 if(phead == NULL){
11
12 return NULL;
13 }
14 else
15 {
16 /*周遊連結清單*/
17 while(temp != NULL){
18
19 if(strcmp(name,temp->name) == 0)
20 {
21 return temp;
22 }
23 temp = temp->next;
24
25 }
26
27 return NULL;
28 }
29
30 }
31
32 int main ()
33 {
34 char buf[128]={'\0'};
35 struct Animal *phead = NULL;
36 struct Animal *des = NULL;
37
38 /*将對象做成一個連結清單*/
39 phead = putdogintolink(phead);
40 phead = putcatintolink(phead);
41 phead = putpersonintolink(phead);
42
43 while(1){
44
45
46 printf("請輸入對象的名字\n");
47 scanf("%s",buf);
48
49
50
51 des = getDes(buf,phead);//擷取目标對象
52
53 if(des == NULL)
54 {
55 printf("目标對象不存在\n");
56 }
57 else
58 {
59
60 des->pbeat();
61 des->peat();
62 }
63
64 memset(buf,'\0',sizeof(buf));/*清空buf*/
65
66 }
67
68
69
70
71
72 }
每添加一個對象就增加一個檔案,在頭檔案中申明類類型和插傳入連結表函數。在主程式中形成對象連結清單。根據對象的名字 來周遊連結清單,來找到目标對象。進而實作調用對象裡面的功能函數。