在一些情况下,对一个消息(含事件)的响应和处理需要很多对象来参与,这些对象对消息的处理有前后顺序,形成一个处理链条,但对象是否真正处理消息有赖于在它之前的对象的处理策略,前一个对象处理后,后一个对象则不需参与处理,这就是责任链模式。现实中有很多类似的场景,比如上访,上访一般是从最基层的信访部门接受信访开始进行处理,如果下一级信访部门无法处理,则交给上一级部门进行处理,这样一级一级的处理,知道最高信访部门。这样所有层级的信访部门就构成了一个责任链。
<code>public</code> <code>abstract</code> <code>class</code> <code>Chain_Successor</code>
<code>{</code>
<code> </code><code>protected</code> <code>Chain_Successor successor; </code><code>//保存后继责任者的引用</code>
<code> </code><code>/// <summary></code>
<code> </code><code>/// 处理需求</code>
<code> </code><code>/// </summary></code>
<code> </code><code>/// <param name="request">需要处理的类</param></code>
<code> </code><code>public</code> <code>abstract</code> <code>void</code> <code>HandleReqest(Chain_Request request);</code>
<code> </code><code>/// 设置后继责任者</code>
<code> </code><code>/// <param name="successor">后继责任者</param></code>
<code> </code><code>public</code> <code>void</code> <code>SetChain_Successor(Chain_Successor successor)</code>
<code> </code><code>{</code>
<code> </code><code>this</code><code>.successor = successor;</code>
<code> </code><code>}</code>
<code>}</code>
<code>public</code> <code>class</code> <code>Chain_ConcreateHandleA : Chain_Successor</code>
<code> </code><code>public</code> <code>Chain_ConcreateHandleA()</code>
<code> </code><code>public</code> <code>override</code> <code>void</code> <code>HandleReqest(Chain_Request request)</code>
<code> </code><code>//如果自己能处理则处理,否则传递给后继者</code>
<code> </code><code>if</code><code>(request.Request_Type==1)</code>
<code> </code><code>{</code>
<code> </code><code>System.Windows.Forms.MessageBox.Show(</code><code>this</code><code>.ToString()+</code><code>":"</code><code>+request.Request_Parameters);</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>if</code><code>(</code><code>this</code><code>.successor!=</code><code>null</code><code>)</code>
<code> </code><code>successor.HandleReqest(request);</code>
<code>public</code> <code>class</code> <code>Chain_ConcreateHandleB : Chain_Successor</code>
<code> </code><code>public</code> <code>Chain_ConcreateHandleB()</code>
<code> </code><code>if</code><code>(request.Request_Type==2)</code>
<code> </code><code>successor.HandleReqest(request);</code>
<code>public</code> <code>class</code> <code>Chain_ConcreateHandleC : Chain_Successor</code>
<code> </code><code>public</code> <code>Chain_ConcreateHandleC()</code>
<code> </code><code>if</code><code>(request.Request_Type==3)</code>
<code>public</code> <code>class</code> <code>Chain_Request</code>
<code> </code><code>//下面的两个参数可更加具体需要进行构造</code>
<code> </code><code>private</code> <code>int</code> <code>_Request_type;</code>
<code> </code><code>private</code> <code>string</code> <code>_Request_parameters;</code>
<code> </code><code>public</code> <code>Chain_Request(</code><code>int</code> <code>Request_type,</code><code>string</code> <code>RequestParameters)</code>
<code> </code><code>this</code><code>._Request_type = Request_type;</code>
<code> </code><code>this</code><code>._Request_parameters = RequestParameters;</code>
<code> </code><code>public</code> <code>int</code> <code>Request_Type</code>
<code> </code><code>get</code>
<code> </code><code>return</code> <code>_Request_type;</code>
<code> </code><code>set</code>
<code> </code><code>_Request_type = value;</code>
<code> </code><code>} </code>
<code> </code><code>public</code> <code>string</code> <code>Request_Parameters</code>
<code> </code><code>return</code> <code>_Request_parameters;</code>
<code> </code><code>_Request_parameters = value;</code>
<code>public</code> <code>class</code> <code>Chain_Client</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>Test()</code>
<code> </code><code>Chain_Successor firstHandler = </code><code>new</code> <code>Chain_ConcreateHandleA();</code>
<code> </code><code> Chain_Successor secondHandler = </code><code>new</code> <code>Chain_ConcreateHandleB();</code>
<code> </code><code> Chain_Successor ThirdHandler = </code><code>new</code> <code>Chain_ConcreateHandleC();</code>
<code> </code><code> firstHandler.SetChain_Successor(secondHandler);</code>
<code> </code><code> secondHandler.SetChain_Successor(ThirdHandler);</code>
<code> </code><code>firstHandler.HandleReqest(</code><code>new</code> <code>Chain_Request(2,</code><code>"hello,the world!"</code><code>));</code>
本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/3504542.html ,如需转载请自行联系原作者