责任链模式
责任链模式结构:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace DesignPattern.BehavioralPattern
7 {
8 #region 责任链模式要点
9 //定义: 允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
10 //
11 //使用场景:
12 //1.程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时,将多个处理者连接成一条链。
13 //2.当必须按顺序执行多个处理者时,所有请求都会严格按照顺序通过链上的处理者。
14 //3.所需处理者及其顺序必须在运行时进行改变,在处理者类中有对引用成员变量(Handler)的设定方法,
15 // 你将能动态地插入和移除处理者, 或者改变其顺序。
16
17 /*实现方式:
18 1.声明处理者接口并描述请求处理方法的签名。
19
20 2.确定客户端如何将请求数据传递给方法。最灵活的方式是将请求转换为对象,然后将其以参数的形式传递给处理函数。
21 为了在具体处理者中消除重复的样本代码, 你可以根据处理者接口创建抽象处理者基类。
22
23 该类需要有一个成员变量来存储指向链上下个处理者的引用。 你可以将其设置为不可变类。
24 但如果你打算在运行时对链进行改变, 则需要定义一个设定方法来修改引用成员变量的值。
25
26 为了使用方便, 你还可以实现处理方法的默认行为。 如果还有剩余对象, 该方法会将请求传递给下个对象。
27 具体处理者还能够通过调用父对象的方法来使用这一行为。
28
29 3.依次创建具体处理者子类并实现其处理方法。 每个处理者在接收到请求后都必须做出两个决定:
30 *是否自行处理这个请求。
31 *是否将该请求沿着链进行传递。
32
33 4.客户端可以自行组装链, 或者从其他对象处获得预先组装好的链。
34 在后一种情况下, 你必须实现工厂类以根据配置或环境设置来创建链。
35
36 5.客户端可以触发链中的任意处理者, 而不仅仅是第一个。
37 请求将通过链进行传递, 直至某个处理者拒绝继续传递, 或者请求到达链尾。
38
39 6.由于链的动态性, 客户端需要准备好处理以下情况:
40 *链中可能只有单个链接。
41 *部分请求可能无法到达链尾。
42 *其他请求可能直到链尾都未被处理。
43 */
44
45
46 #endregion
47
48
49 //处理者 (Handler) 声明了所有具体处理者的通用接口。
50 //该接口通常仅包含单个方法用于请求处理,但有时其还会包含一个设置链上下个处理者的方法。
51 public interface IHandler
52 {
53 void SetNextHandler(IHandler handler);
54
55 bool HandleProcess(object request);
56
57 }
58
59
60 //基础处理者 (Base Handler) 是一个可选的类, 你可以将所有处理者共用的样本代码放置在其中。
61 //通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。
62 //客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。
63 //该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。
64 public abstract class AbstractHandler : IHandler
65 {
66 IHandler _netxHandler;
67
68 public virtual bool HandleProcess(object request)
69 {
70 if (_netxHandler != null)
71 {
72 return _netxHandler.HandleProcess(request);
73 }
74 else
75 {
76 Console.WriteLine("责任无人处理");
77 return false;
78 }
79 }
80
81 public void SetNextHandler(IHandler handler)
82 {
83 this._netxHandler = handler;
84 }
85 }
86
87 //具体处理者 (Concrete Handlers) 包含处理请求的实际代码。
88 //每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。
89 //处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。
90 public class ConcretHandlerA : AbstractHandler
91 {
92 public override bool HandleProcess(object request)
93 {
94 if (request.ToString().Equals("A"))
95 {
96 Console.WriteLine("ConcretHandlerA 责任已处理");
97 return true;
98 }
99 else
100 {
101 Console.WriteLine("ConcretHandlerA 责任转交下一级");
102 return base.HandleProcess(request);
103 }
104 }
105 }
106
107 public class ConcretHandlerB : AbstractHandler
108 {
109 public override bool HandleProcess(object request)
110 {
111 if (request.ToString().Equals("B"))
112 {
113 Console.WriteLine("ConcretHandlerB 责任已处理");
114 return true;
115 }
116 else
117 {
118 Console.WriteLine("ConcretHandlerB 责任转交下一级");
119 return base.HandleProcess(request);
120 }
121 }
122 }
123
124 public class ConcretHandlerC : AbstractHandler
125 {
126 public override bool HandleProcess(object request)
127 {
128 if (request.ToString().Equals("C"))
129 {
130 Console.WriteLine("ConcretHandlerC 责任已处理");
131 return true;
132 }
133 else
134 {
135 Console.WriteLine("ConcretHandlerC 责任转交下一级");
136 return base.HandleProcess(request);
137 }
138 }
139 }
140
141
142 //客户端 (Client) 可根据程序逻辑一次性或者动态地生成链。
143 //值得注意的是, 请求可发送给链上的任意一个处理者, 而非必须是第一个处理者。
144 public class ChainOfResponsibilityClient
145 {
146 public static void Test()
147 {
148 IHandler handlera = new ConcretHandlerA();
149 IHandler handlerb = new ConcretHandlerB();
150 IHandler handlerc = new ConcretHandlerC();
151
152 handlera.SetNextHandler(handlerb);
153 handlerb.SetNextHandler(handlerc);
154
155 handlera.HandleProcess("C");
156 }
157 }
158 }
浙公网安备 33010602011771号