极速理解设计模式系列:12.责任链模式(Chain of Responsibility Pattern)

四个角色:传递者接口(Handler)、具体传递者(ConcreteHandler)、客户端(Client) 

        传递者接口(Handler):定义一个处理请求的接口和实现下一个对象

        具体传递者(ConcreteHandler):如果能够处理就处理,否则让上级处理请求

        客户端(Client) :创立责任链,并向链中对象提出请求

 实现思路:传递者接口设置上级然后提供一个处理请求的方法,在具体传递中如果能够处理就处理,否则就让其上级来处理,客户端组织其责任链,并且设置请求。

 类图:

极速理解设计模式系列:12.责任链模式(Chain of Responsibility Pattern)

应用场景:OA系统中的请假审批系统,普通开发者想请假,如果请1天及以下的假则只需要开发经理许可,如果1天<请假天数<=5天则需要总监许可,如果5天<请假天数<=10天则需要副总裁批准,如果请假天数>10天则需要总裁许可。

分析:在客户端设置责任链和请假审批的上级下级,然后每次普通开发者将请假申请提交到开发经理,如果在开发经理许可范围之内,则处理,否则提交给他的上级总监,以此类推处理这个请假请求。

        下面我们在控制台程序去演示一下如何使用Chain of Responsibility Pattern:

        一、 传递者接口(Handler)

 


  1. //传递者接口(Handler) 
  2. abstract class Higher 
  3.     public string Name { get; set; } 
  4.     public Higher higher; 
  5.     public void SetHigher(Higher _Higher) 
  6.     { 
  7.         this.higher = _Higher; 
  8.     } 
  9.     public Higher(string name
  10.     { 
  11.         Name = name
  12.     } 
  13.     public abstract void ExeApply(Apply apply); 

        二、具体传递者(ConcreteHandler)

 


  1. //具体传递者(ConcreteHandler) 
  2. class ManagerHigher : Higher 
  3.     public ManagerHigher(string name) : base(name) { } 
  4.     public override void ExeApply(Apply apply) 
  5.     { 
  6.         if (apply.ApplyDay <= 1) 
  7.             Console.WriteLine(Name + " 批准 " + apply.ApplyName + " 申请了 " + apply.ApplyDay + "天假期"); 
  8.         else 
  9.             higher.ExeApply(apply); 
  10.     } 
  11.  
  12. //具体传递者(ConcreteHandler) 
  13. class DirectorHigher : Higher 
  14.     public DirectorHigher(string name) : base(name) { } 
  15.     public override void ExeApply(Apply apply) 
  16.     { 
  17.         if (apply.ApplyDay <= 5) 
  18.             Console.WriteLine(Name + " 批准 " + apply.ApplyName + " 申请了 " + apply.ApplyDay + "天假期"); 
  19.         else 
  20.             higher.ExeApply(apply); 
  21.     } 
  22.  
  23. //具体传递者(ConcreteHandler) 
  24. class VPHigher : Higher 
  25.     public VPHigher(string name) : base(name) { } 
  26.     public override void ExeApply(Apply apply) 
  27.     { 
  28.         if (apply.ApplyDay <= 10) 
  29.             Console.WriteLine(Name + " 批准 " + apply.ApplyName + " 申请了 " + apply.ApplyDay + "天假期"); 
  30.         else 
  31.             higher.ExeApply(apply); 
  32.     } 
  33.  
  34. //具体传递者(ConcreteHandler) 
  35. class CEOHigher : Higher 
  36.     public CEOHigher(string name) : base(name) { } 
  37.     public override void ExeApply(Apply apply) 
  38.     { 
  39.         if (apply.ApplyDay>10) 
  40.             Console.WriteLine(Name + " 批准 " + apply.ApplyName + " 申请了 " + apply.ApplyDay + "天假期"); 
  41.         else 
  42.             higher.ExeApply(apply); 
  43.     } 

        三、客户端(Client)

 


  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         //责任链模式的创建 
  5.         Higher managerHigher = new ManagerHigher("张三经理"); 
  6.         Higher directorHigher = new DirectorHigher("李四总监"); 
  7.         Higher vpHigher = new VPHigher("王五副总裁"); 
  8.         Higher ceoHigher = new CEOHigher("林一总裁"); 
  9.         managerHigher.SetHigher(directorHigher); 
  10.         directorHigher.SetHigher(vpHigher); 
  11.         vpHigher.SetHigher(ceoHigher); 
  12.  
  13.         //创建申请人 
  14.         Apply liuying = new Apply() { ApplyName = "刘颖", ApplyDay = 5 }; 
  15.         Apply chenming = new Apply() { ApplyName = "陈明", ApplyDay = 1 }; 
  16.         Apply zengli = new Apply() { ApplyName = "曾利", ApplyDay = 15 }; 
  17.  
  18.         //申请人都将申请提交给经理 
  19.         managerHigher.ExeApply(liuying); 
  20.         managerHigher.ExeApply(chenming); 
  21.         managerHigher.ExeApply(zengli); 
  22.  
  23.         Console.ReadLine(); 
  24.     } 

        申请人

 


  1. //申请人 
  2. class Apply 
  3.     public string ApplyName { get; set; } 
  4.     public double ApplyDay { get; set; } 

        如需源码请点击 ResponsibilityPattern.rar  下载。



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827004

上一篇:MongoDB 搭建分片集群


下一篇:如何将UI5应用部署到Fiori On-Premise和On-Cloud的Launchpad上去