职责链模式(Chain Of Responsibility)

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

                    将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

结构图:

 

实现代码:

 1 namespace ChainOfResponsibilityPattern
 2 {
 3     //2017.06.24 15:44 by ldb
 4     //Handler类,定义一个处理请示的接口。
 5     abstract class Handler
 6     {
 7         protected Handler successor;
 8         public void SetSuccessor(Handler successor)//设置继承者。
 9         {
10             this.successor = successor;
11         }
12 
13         public abstract void HandleRequest(int request);//处理请求的抽象方法。
14     }
15     /// <summary>
16     /// 具体处理类,该类只能处理0到10之间的的请求,否则转到下一位。
17     /// </summary>
18     class ConcreteHandler1 : Handler
19     {
20         public override void HandleRequest(int request)
21         {
22             if (request >= 0 && request <= 10)
23             {
24                 Console.WriteLine("{0} 处理请求{1}",this.GetType().Name,request);
25             }
26             else if (successor != null)
27             {
28                 successor.HandleRequest(request);//转给下一位。
29             }
30         }
31     }
32     /// <summary>
33     /// 具体处理类,该类只能处理11到20之间的的请求,否则转到下一位。
34     /// </summary>
35     class ConcreteHandler2 : Handler
36     {
37         public override void HandleRequest(int request)
38         {
39             if (request >= 11 && request <= 20)
40             {
41                 Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
42             }
43             else if (successor != null)
44             {
45                 successor.HandleRequest(request);//转给下一位。
46             }
47         }
48     }
49 
50     /// <summary>
51     /// 具体处理类,该类只能处理21到30之间的的请求,否则转到下一位。
52     /// </summary>
53     class ConcreteHandler3 : Handler
54     {
55         public override void HandleRequest(int request)
56         {
57             if (request >= 21 && request <= 30)
58             {
59                 Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
60             }
61             else if (successor != null)
62             {
63                 successor.HandleRequest(request);//转给下一位。
64             }
65         }
66     }
67     class Program
68     {
69         static void Main(string[] args)
70         {
71             Handler h1 = new ConcreteHandler1();
72             Handler h2 = new ConcreteHandler2();
73             Handler h3 = new ConcreteHandler3();
74 
75             h1.SetSuccessor(h2);//设置职责链上家与下家。
76             h2.SetSuccessor(h3);
77 
78             int[] requests = new int[] {2,5,14,22,18,3,27,20 };
79             foreach (var request in requests)//循环给最小处理者提交请求,不同的数额,由不同权限者处理。
80             {
81                 h1.HandleRequest(request);
82             }
83 
84             Console.ReadKey();
85         }
86     }
87 }

结果:

 

posted @ 2017-06-24 16:24  longdb  阅读(135)  评论(0)    收藏  举报