GoF——职责链模式

职责链模式(chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

 

结构图:

UML

 

 

 

 

 

 

 

职责链的好处

  关键:当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象处理它为止

  使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结构式职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者者的引用。大大降低了耦合度。

  必须要全面考虑,因为一个请求有可能到了链的末尾也得不到处理,或者因为没有正确配置而没有得到处理。

 

代码示例:

  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace 职责链模式
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             Handler h1 = new ConcreteHandler1();
12             Handler h2 = new ConcreteHandler2();
13             Handler h3 = new ConcreteHandler3();
14             h1.SetSuccessor(h2);
15             h2.SetSuccessor(h3);
16 
17             int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
18 
19             foreach (int request in requests)
20             {
21                 h1.HandleRequest(request);
22             }
23 
24             Console.Read();
25 
26         }
27     }
28 
29     abstract class Handler
30     {
31         protected Handler successor;
32 
33         public void SetSuccessor(Handler successor)
34         {
35             this.successor = successor;
36         }
37 
38         public abstract void HandleRequest(int request);
39     }
40 
41     class ConcreteHandler1 : Handler
42     {
43         public override void HandleRequest(int request)
44         {
45             if (request >= 0 && request < 10)
46             {
47                 Console.WriteLine("{0}  处理请求  {1}",
48                   this.GetType().Name, request);
49             }
50             else if (successor != null)
51             {
52                 successor.HandleRequest(request);
53             }
54         }
55     }
56 
57     class ConcreteHandler2 : Handler
58     {
59         public override void HandleRequest(int request)
60         {
61             if (request >= 10 && request < 20)
62             {
63                 Console.WriteLine("{0}  处理请求  {1}",
64                   this.GetType().Name, request);
65             }
66             else if (successor != null)
67             {
68                 successor.HandleRequest(request);
69             }
70         }
71     }
72 
73     class ConcreteHandler3 : Handler
74     {
75         public override void HandleRequest(int request)
76         {
77             if (request >= 20 && request < 30)
78             {
79                 Console.WriteLine("{0}  处理请求  {1}",
80                   this.GetType().Name, request);
81             }
82             else if (successor != null)
83             {
84                 successor.HandleRequest(request);
85             }
86         }
87     }
88 
89 }
View Code

 

 

 

2016-04-08

 

posted @ 2016-04-08 08:53  图哈特  阅读(204)  评论(0编辑  收藏  举报