职责链的定义是:
通过提供多个对象处理一次请求来避免耦合请求的发送者和接收者。把这些对象链接起来,通过链条传递请求,直到有一个对象处理。
其UML类图的示例如下:
在这个模式中,参与者包括:
- Handler:
- 定义一个接口用于处理请求。
- (可选)实现后续的链接。
- ConcreteHandler:
- 处理其负责的请求。
- 访问其后续。
- 如果ConcreteHandler可以处理请求,就处理,如果不能就把请求转发给后续。
- Client:在链上把请求初始化给ConcreteHandler对象。
实现代码:
public abstract class Handler
{
protected Handler _successor;
public abstract void HandleRequest(int request);
public void SetSuccessor(Handler successor)
{
_successor = successor;
}
}
public class ConcreteHandlerA : Handler
{
public override void HandleRequest(int request)
{
if (request == 1)
Console.WriteLine("Handled by ConcreteHandlerA");
else if (_successor != null)
_successor.HandleRequest(request);
}
}
public class ConcreteHandlerB : Handler
{
public override void HandleRequest(int request)
{
if (request > 10)
Console.WriteLine("Handled by ConcreteHandlerB");
else if (_successor != null)
_successor.HandleRequest(request);
}
}
使用场景:
- 用一组handle处理一个请求。
- 需要传一个请求给一个Hanlder列表中的handler。
- C#中的异常处理就是这个模式。