Skip to content

Head First 设计模式 17-责任链模式

🏷️ 《Head First 设计模式》

当你想让一个以上的对象有机会能够处理某个请求的时候,就是用责任链模式(Chain of Responsibility Pattern)。

书中没有具体的代码示例,不过在 C# 中 delegate 类型可以很容易的实现这个模式。

示例代码及类图如下:

csharp
class Program
{
    private delegate void HandlerDelegate();

    static void Main(string[] args)
    {
        var handler = new HandlerDelegate(new SpamHandler().HandleReqeust);
        handler += new FanHandler().HandleReqeust;
        handler += new ComplaintHandler().HandleReqeust;
        handler += new NewLocHandler().HandleReqeust;
        handler();
        Console.ReadLine();
    }
}

优点

  • 将请求的发送者和接收者解耦。
  • 可以简化你的对象,因为它不需要知道链的结构。
  • 可以改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任。

用途和缺点

  • 经常被使用在窗口系统中,处理鼠标和键盘之类的事件。
  • 并不保证请求一定会被执行;如果没有任何对象处理它的话,它可能会落到链尾端之外(这可以是优点,也可以是缺点)。
  • 可能不容易观察运行时的特征,有碍于除错。