刚开始学设计模式,也没按套路出牌,直接从行为型模式入手,查了查责任链,感觉和工作流联系挺大,或者说是业务流程,或者成为办公自动化。
曾经用过工作流,在公司里,比我我发起了一个工作流,下一步流到小组长那里,在下一步流到主任那里,小组长和主任都需要进行审核,审核不合格的话驳回,于是有可能驳回到我这,工作流可以正向和反向流动。
感觉责任链的好处是可以比较容易的增删某个流程,调整流程间的关系,而且结构也很清晰。
当时觉得这个东西很神奇,现在看了责任链的知识感觉有点联系,于是写了个驾校考试的小程序。
考试分为科目一,科目二,科目三,科目四没加,有三个就够我考的了。科目一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);
}