首页 > Asp.net开发 > C#设计模式之责任链模式

C#设计模式之责任链模式

实例:

实现一个简单的加薪流程

 

UML类图:


 

 

实例实现代码:

[csharp]

  1. static void Main(string[] args)  
  2. {  
  3.   
  4.     CommonManager jinli = new CommonManager("金利");  
  5.     Majordomo zongjian = new Majordomo("宗剑");  
  6.     GeneralManager zhongjingli = new GeneralManager("钟精励");  
  7.     jinli.SetSuperior(zongjian);  
  8.     zongjian.SetSuperior(zhongjingli);  
  9.   
  10.     Request request = new Request();  
  11.     request.RequestType = "请假";  
  12.     request.RequestContent = "小菜请假";  
  13.     request.Number = 1;  
  14.     jinli.RequestApplications(request);  
  15.   
  16.     Request request2 = new Request();  
  17.     request2.RequestType = "请假";  
  18.     request2.RequestContent = "小菜请假";  
  19.     request2.Number = 4;  
  20.     jinli.RequestApplications(request2);  
  21.   
  22.     Request request3 = new Request();  
  23.     request3.RequestType = "加薪";  
  24.     request3.RequestContent = "小菜请求加薪";  
  25.     request3.Number = 500;  
  26.     jinli.RequestApplications(request3);  
  27.   
  28.     Request request4 = new Request();  
  29.     request4.RequestType = "加薪";  
  30.     request4.RequestContent = "小菜请求加薪";  
  31.     request4.Number = 1000;  
  32.     jinli.RequestApplications(request4);  
  33.   
  34.     Console.Read();  
  35.   
  36. }  

[csharp]

  1. //管理者  
  2. abstract class Manager  
  3. {  
  4.     protected string name;  
  5.     //管理者的上级  
  6.     protected Manager superior;  
  7.   
  8.     public Manager(string name)  
  9.     {  
  10.         this.name = name;  
  11.     }  
  12.   
  13.     //设置管理者的上级  
  14.     public void SetSuperior(Manager superior)  
  15.     {  
  16.         this.superior = superior;  
  17.     }  
  18.   
  19.     //申请请求  
  20.     abstract public void RequestApplications(Request request);  
  21. }  
  22.   
  23. //经理  
  24. class CommonManager : Manager  
  25. {  
  26.     public CommonManager(string name)  
  27.         : base(name)  
  28.     { }  
  29.     public override void RequestApplications(Request request)  
  30.     {  
  31.   
  32.         if (request.RequestType == "请假" && request.Number <= 2)  
  33.         {  
  34.             Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);  
  35.         }  
  36.         else  
  37.         {  
  38.             if (superior != null)  
  39.                 superior.RequestApplications(request);  
  40.         }  
  41.   
  42.     }  
  43. }  
  44.   
  45. //总监  
  46. class Majordomo : Manager  
  47. {  
  48.     public Majordomo(string name)  
  49.         : base(name)  
  50.     { }  
  51.     public override void RequestApplications(Request request)  
  52.     {  
  53.   
  54.         if (request.RequestType == "请假" && request.Number <= 5)  
  55.         {  
  56.             Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);  
  57.         }  
  58.         else  
  59.         {  
  60.             if (superior != null)  
  61.                 superior.RequestApplications(request);  
  62.         }  
  63.   
  64.     }  
  65. }  
  66.   
  67. //总经理  
  68. class GeneralManager : Manager  
  69. {  
  70.     public GeneralManager(string name)  
  71.         : base(name)  
  72.     { }  
  73.     public override void RequestApplications(Request request)  
  74.     {  
  75.   
  76.         if (request.RequestType == "请假")  
  77.         {  
  78.             Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);  
  79.         }  
  80.         else if (request.RequestType == "加薪" && request.Number <= 500)  
  81.         {  
  82.             Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.RequestContent, request.Number);  
  83.         }  
  84.         else if (request.RequestType == "加薪" && request.Number > 500)  
  85.         {  
  86.             Console.WriteLine("{0}:{1} 数量{2} 再说吧", name, request.RequestContent, request.Number);  
  87.         }  
  88.     }  
  89. }  
  90.   
  91. //申请  
  92. class Request  
  93. {  
  94.     //申请类别  
  95.     private string requestType;  
  96.     public string RequestType  
  97.     {  
  98.         get { return requestType; }  
  99.         set { requestType = value; }  
  100.     }  
  101.   
  102.     //申请内容  
  103.     private string requestContent;  
  104.     public string RequestContent  
  105.     {  
  106.         get { return requestContent; }  
  107.         set { requestContent = value; }  
  108.     }  
  109.   
  110.     //数量  
  111.     private int number;  
  112.     public int Number  
  113.     {  
  114.         get { return number; }  
  115.         set { number = value; }  
  116.     }  
  117. }  

说明:

责任链模式的主要思想是,对象引用了同一类型的另一个对象,就如上面的经理引用总监,总监引用总经理,形成一条链。链中的每个对象实现了同样地方法,处理对链中的第一个对象发起的同一个请求。如果一个对象不知道如何处理请求,它就把请求传给下一个响应器(successor)。处理请求的对象与其successor之间的关系是聚合关系。

智慧链条中的每个单元都可以为问题的解决作出贡献,如果一个人不知道如何解决问题,就把问题沿着链条向下传递,也许就有人能解决问题。装配线上的工人,每个工人都有自己的专长和职责,因此责任链就是这样形成:“这个问题我不懂,也许你懂”;“我的活干完了,该你了”

这种“智慧”或“职责”的链条,允许进一步的升级和扩展,而不必修改已有单元的功能,只要把新的单元添加到链中,链就会有更多的功能;就像向生产线加工人不应该影响原有的工人。

使用情形:

有多个对象可以处理请求,而处理程序只有在运行时才能确定;

责任链模式涉及到的角色如下所示:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

参考资料

-《大话设计模式》


本文固定链接: http://www.devba.com/index.php/archives/6307.html | 开发吧

报歉!评论已关闭.