设计模式初探——责任链 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);

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆腐白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值