Head First 设计模式 17-责任链模式
当你想让一个以上的对象有机会能够处理某个请求的时候,就是用责任链模式(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();
}
}
优点
- 将请求的发送者和接收者解耦。
- 可以简化你的对象,因为它不需要知道链的结构。
- 可以改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任。
用途和缺点
- 经常被使用在窗口系统中,处理鼠标和键盘之类的事件。
- 并不保证请求一定会被执行;如果没有任何对象处理它的话,它可能会落到链尾端之外(这可以是优点,也可以是缺点)。
- 可能不容易观察运行时的特征,有碍于除错。