設計模式初探——責任鏈 c語言版

剛開始學設計模式,也沒按套路出牌,直接從行爲型模式入手,查了查責任鏈,感覺和工作流聯繫挺大,或者說是業務流程,或者成爲辦公自動化。

曾經用過工作流,在公司裏,比我我發起了一個工作流,下一步流到小組長那裏,在下一步流到主任那裏,小組長和主任都需要進行審覈,審覈不合格的話駁回,於是有可能駁回到我這,工作流可以正向和反向流動。

感覺責任鏈的好處是可以比較容易的增刪某個流程,調整流程間的關係,而且結構也很清晰。

當時覺得這個東西很神奇,現在看了責任鏈的知識感覺有點聯繫,於是寫了個駕校考試的小程序。

考試分爲科目一,科目二,科目三,科目四沒加,有三個就夠我考的了。科目一90分,及格,科目二80分及格,科目三90分及格,只有通過了科目一才能考科目二,任何一可沒通過則需重考,基本上是完全模擬真實考試情況,考試分數由隨機數給出。



上圖爲兩次執行的結果,看來不同人的考試水平相差甚遠吶。

#include <stdio.h>
#include <stdlib.h>
week =0;
int stu () {
    return rand()%50 +50;
}
struct Test {
        void (* taketest)(int score, struct Test* kemu);
        struct Test* next;
        struct Test* prev;
};
void test1 (int score, struct Test* kemu) {
    week++;
    if (score > 90) {
        printf ("理論考了 %d 分 > 90,你是天才!請準備下週考倒樁。\n", score);
        kemu->next->taketest (stu(), kemu->next);
    }
    else {
        printf ("理論考了 %d 分 < 90,昨晚喝多了吧!下週準備重考理論!\n", score);
        kemu->prev->taketest (stu(), kemu->prev);
    }
}
void test2 (int score, struct Test* kemu) {
    week++;
    if (score > 80) {
        printf ("倒樁考了 %d 分 > 80,你是天才!請準備下週考街試。\n", score);
        kemu->next->taketest (stu(), kemu->next);                   //重考科二,科二的prev的next還等於科二
    }
    else {
        printf ("倒樁考了 %d 分 < 80,昨晚喝多了吧!下週準備重考街試!\n", score);
        kemu->prev->next->taketest (stu(), kemu->prev->next);
    }
}
void test3 (int score, struct Test* kemu) {
    week++;
     if (score > 90) {
        printf ("街試考了 %d 分 > 90, 地球人已經不能阻止你成爲馬路殺手了,你通過了所有考試!\n \總共用了 %d 周",score, week);
        return 0;
    }
    else {
        printf ("科目三考了 %d 分 < 90,昨晚喝多了吧!下週準備重考街試!\n", score);
        kemu->prev->next->taketest (stu(), kemu->prev->next);           //重考科三,科二的prev的next還等於科三
    }
}
int main (void) {

    srand((unsigned) time(0));
    struct Test kemu1, kemu2, kemu3;
    kemu1.prev = &kemu1;                            //科一爲過則重考科一
    kemu1.next = &kemu2, kemu2.prev = &kemu1;       //如果要增加或刪減科目只要在這裏調整指向關係即可
    kemu2.next = &kemu3, kemu3.prev = &kemu2;
    kemu3.next = &kemu3;                            //科三爲過則重考科三

    kemu1.taketest = test1;
    kemu2.taketest = test2;
    kemu3.taketest = test3;

    kemu1.taketest (stu(),&kemu1);

}


發佈了40 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章