职责链模式(Chain of Responsibility)

//注意职责链模式和状态模式的区别。

状态模式的逻辑顺序不一定是线性的。(每个状态中只需判断即可)

职责链模式的逻辑顺序是线性的。(每个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 }

 

posted @ 2012-05-17 12:56  ZH奶酪  阅读(355)  评论(0编辑  收藏  举报