//注意职责链模式和状态模式的区别。
状态模式的逻辑顺序不一定是线性的。(每个状态中只需判断即可)
职责链模式的逻辑顺序是线性的。(每个Handler要设置Prior)
1 /* 2 * 高校学生请假需要符合学校规定,假如班主任可以批准1天假,系主任可以批 3 * 准7天假,各学院院长可以批准30天,学校校长可以批准1年。应用职责链模 4 * 式,用C#控制台应用程序实现该设计。 5 */ 6 using System; 7 using System.Collections.Generic; 8 using System.Linq; 9 using System.Text; 10 11 namespace ChainOfResponsibility 12 { 13 abstract class Teacher 14 { 15 protected string name; 16 protected Teacher prior; 17 public Teacher(string name) 18 { 19 this.name = name; 20 } 21 public void SetPrior(Teacher prior) 22 { 23 this.prior = prior; 24 } 25 public abstract void Handle(int request); 26 } 27 class BanZhuRen : Teacher 28 { 29 public BanZhuRen(string name) 30 : base(name) 31 { } 32 public override void Handle(int request) 33 { 34 if (request == 1) 35 { 36 Console.WriteLine("{0}:学生请假" + request + "天被批准了!", name); 37 } 38 else 39 { 40 prior.Handle(request); 41 } 42 } 43 } 44 class XiZhuRen : Teacher 45 { 46 public XiZhuRen(string name) 47 : base(name) 48 { } 49 public override void Handle(int request) 50 { 51 if (request <= 7) 52 { 53 Console.WriteLine("{0}:学生请假" + request + "天被批准了!", name); 54 } 55 else 56 { 57 prior.Handle(request); 58 } 59 } 60 } 61 class YuanZhang : Teacher 62 { 63 public YuanZhang(string name) 64 : base(name) 65 { } 66 public override void Handle(int request) 67 { 68 if (request <= 30) 69 { 70 Console.WriteLine("{0}:学生请假" + request + "天被批准了!", name); 71 } 72 else 73 { 74 prior.Handle(request); 75 } 76 } 77 } 78 class XiaoZhang : Teacher 79 { 80 public XiaoZhang(string name) 81 : base(name) 82 { } 83 public override void Handle(int request) 84 { 85 if (request <= 365) 86 { 87 Console.WriteLine("{0}:学生请假" + request + "天被批准了!", name); 88 } 89 else 90 { 91 Console.WriteLine("{0}:请假这么多天,干脆休学一年算了!", name); 92 } 93 } 94 } 95 class Program 96 { 97 static void Main(string[] args) 98 { 99 BanZhuRen bzr = new BanZhuRen("班竹韧"); 100 XiZhuRen xzr = new XiZhuRen("西祝任"); 101 YuanZhang yz = new YuanZhang("袁章"); 102 XiaoZhang xz = new XiaoZhang("肖长"); 103 104 bzr.SetPrior(xzr); 105 xzr.SetPrior(yz); 106 yz.SetPrior(xz); 107 108 string off_days; 109 for (int i = 0; i < 5; i++) 110 { 111 Console.WriteLine("输入请假天数:"); 112 off_days = Console.ReadLine(); 113 bzr.Handle(Convert.ToInt16(off_days)); 114 } 115 } 116 } 117 }
本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/archive/2012/05/17/2506029.html,如需转载请自行联系原作者