原文地址 :http://www.unitymanual.com/blog-27799-3084.html
写写自己对这个设计模式的理解吧。
责任连模式(Chain of Responsibility)概述
在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1W的薪水可能技术经理就可以决定了,但是1W – 5W的薪水可能技术经理就没有这个权利批准,可能就需要请求技术总监的批准,所以在面试的完后,经常会有面试官说,你这个薪水我这边觉得你这个技术可以拿这个薪水的,但是还需要技术总监的批准等话,这个例子也就诠释了本文要介绍的内容。
定义:
责任链模式:某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子,并沿着这条链子传递该请求,直到有对象处理它位置。
责任链模式结构:
责任链模式参与者:
抽象处理者角色(Handler):定义出一个处理请求的接口。这个接口通常由接口活抽象类来实现。
具体处理者角色(ConcreteHandler):具体处理者接受到请求后,可以选择将该请求处理掉,或者将请求传给下一个处理者。因此,每个具体处理者需要保存下一个处理这的引用,以便把请求传递下去。
责任链模式结构实现:
1、 /// <summary>
2、 /// 抽象处理类
3、 /// </summary>
4、 public abstract class Handler
5、 {
6、 protected Handler successor;
7、
8、 public void SetSuccessor(Handler successor)
9、 {
10、 this.successor = successor;
11、 }
12、
13、 public abstract void HandleRequest(int request);
14、
15、 }
16、 /// <summary>
17、 /// C具体处理类
18、 /// </summary>
19、 public class ConcreteHandler1:Handler
20、 {
21、 public override void HandleRequest(int request)
22、 {
23、 if (request >= 0 && request < 10)
24、 {
25、 Console.WriteLine("{0} handled request{1}",this.GetType().Name,request);
26、 }else if(successor!=null)
27、 {
28、 successor.HandleRequest(request);
29、 }
30、 }
31、 }
32、 /// <summary>
33、 /// C具体处理类
34、 /// </summary>
35、 public class ConcreteHandler2:Handler
36、 {
37、 public override void HandleRequest(int request)
38、 {
39、 if (request >= 10 && request < 20)
40、 {
41、 Console.WriteLine("{0} handled request {1}",this.GetType().Name,request);
42、 }else if(successor !=null)
43、 {
44、 successor.HandleRequest(request);
45、 }
46、 }
47、 }
48、 /// <summary>
49、 /// C具体处理类
50、 /// </summary>
51、 public class ConcreteHandler3:Handler
52、 {
53、 public override void HandleRequest(int request)
54、 {
55、 if(request>=20&&request<30)
56、 {
57、 Console.WriteLine("{0} handled request{1}",this.GetType().Name,request);
58、 }else if(successor !=null)
59、 {
60、 successor.HandleRequest(request);
61、 }
62、 }
63、 }
64、 /// <summary>
65、 /// C客户端类
66、 /// </summary>
67、 class Client
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 = {2,5,14,22,18,3,27,20};
79、
80、 foreach(int request in requests)
81、 {
82、 h1.HandleRequest(request);
83、 }
84、
85、 }
86、 }
责任链模式对要求处理对象有对事件有响应事件,即处理事件。当满足自己的管辖范围时便做出响应的处理,如果不满足自己条件,则要将事件向上反馈,交给其他对象处理。这其实是明确了各个对象的处理范围,通过处理范围将原本判断操作较多的对象细分为功能相近的独立单元,各个独立单元间只有数据传递操作。这样降低了事件处理的耦合。