设计模式初探——责任链 c语言版

来源:互联网 发布:搭建表白墙源码 编辑:程序博客网 时间:2024/06/05 07:39

刚开始学设计模式,也没按套路出牌,直接从行为型模式入手,查了查责任链,感觉和工作流联系挺大,或者说是业务流程,或者成为办公自动化。

曾经用过工作流,在公司里,比我我发起了一个工作流,下一步流到小组长那里,在下一步流到主任那里,小组长和主任都需要进行审核,审核不合格的话驳回,于是有可能驳回到我这,工作流可以正向和反向流动。

感觉责任链的好处是可以比较容易的增删某个流程,调整流程间的关系,而且结构也很清晰。

当时觉得这个东西很神奇,现在看了责任链的知识感觉有点联系,于是写了个驾校考试的小程序。

考试分为科目一,科目二,科目三,科目四没加,有三个就够我考的了。科目一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);}


原创粉丝点击