职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构
Handler
——定义一个处理请求的接口。
——(可选) 实现后继链。
ConcreteHandler
——处理它所负责的请求。
——可访问它的后继者。
——如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
Client
——向链上的具体处理者(ConcreteHandler)对象提交请求。
效果
1)降低耦合度 对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
2)增强了给对象指派职责 ( Responsibility)的灵活性 当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
3)不保证被接受 既然一个请求没有明确的接收者,那么就不能保证它一定会被处理。
实现
1、实现后继者链
1)定义新的链接(通常在Handler中定义,但也可由 ConcreteHandlers 来定义);
2)使用已有的链接。
2、连接后继者
3、表示请求
结构
对象图
Handler
——定义一个处理请求的接口。
——(可选) 实现后继链。
ConcreteHandler
——处理它所负责的请求。
——可访问它的后继者。
——如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
Client
——向链上的具体处理者(ConcreteHandler)对象提交请求。
效果
1)降低耦合度 对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
2)增强了给对象指派职责 ( Responsibility)的灵活性 当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
3)不保证被接受 既然一个请求没有明确的接收者,那么就不能保证它一定会被处理。
实现
1、实现后继者链
1)定义新的链接(通常在Handler中定义,但也可由 ConcreteHandlers 来定义);
2)使用已有的链接。
2、连接后继者
3、表示请求
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyChainofResponsibility
{
abstract class Handler
{
protected Handler successor;
// 设置继任者,用于构建职责链
public void SetSuccessor(Handler successor)
{
this.successor = successor;
}
public abstract void HandleRequest(int request);
}
class ConcrecteHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request < 10)
{
Console.WriteLine("{0} handle the request:{1}.",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request); // 转给后继者处理
}
}
}
class ConcrecteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 10 && request < 20)
{
Console.WriteLine("{0} handle the request:{1}.",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request); // 转给后继者处理
}
}
}
class ConcrecteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 20 && request < 30)
{
Console.WriteLine("{0} handle the request:{1}.",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request); // 转给后继者处理
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyChainofResponsibility
{
class Program
{
static void Main(string[] args)
{
Handler h1 = new ConcrecteHandler1();
Handler h2 = new ConcrecteHandler2();
Handler h3 = new ConcrecteHandler3();
// 构建职责链
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int[] requests = { 2, 14, 11, 27, 10, 3, 23 };
foreach (int request in requests)
{
h1.HandleRequest(request);
}
Console.ReadKey();
}
}
}
相关模式
职责链常与组合(Composite)一起使用。这种情况下,一个构件的父构件可作为它的后继。
组合模式结构图
参考:《设计模式》、《大话设计模式》。