责任链模式(Chain_Of_Responsibility)

First Post:

Last Update:

责任链模式(Chain_Of_Responsibility)

职责链模式(Chain Of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

类似于异常处理机制中定义的那样,代码抛出一个异常,在异常处理链当中,会有一个对象来处理该异常。

职责链模式结构图

责任链模式代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//客户端
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int[] requests = { 2,3,5,6,32,57,5,21 };
foreach(int request in requests)
{
h1.HandleRequest(request);
}

/// Handler类,定义一个处理请示的接口
abstract class Handler
{
protected Handler successor;
//设置继任者
public void SetSuccessor(Handler successor)
{
this.successor = successor;
}
//处理请求的抽象方法
public abstract void HandleRequest(int request);
}

/// ConcreteHandler类,具体处理者类,处理它所负责的请求,
/// 可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者
class ConcreteHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request < 10)
{
Console.WriteLine("处理请求", this.GetType().Name, request);
}
else if(successor!=null){
successor.HandleRequest(request);//移给其他类处理
}
}
}

class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 10 && request < 20)
{
Console.WriteLine("处理请求", this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);//移给其他类处理
}
}
}

class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 20 && request < 30)
{
Console.WriteLine("处理请求", this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);//移给其他类处理
}
}
}

责任链模式总结

  • 类有太多的责任,这违背了单一职责原则,增加新的管理类,又违背了开放-封闭原则。
  • 将各种管理者类别分离开来,均作为管理者的子类,利用多态来化解分支判断的僵化。
  • 用一些“关联”来将管理类中的责任传递,用于把用户的请求传递,直到遇到可以解决这个请求的管理类为止。

责任链的好处

当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构。结果是责任链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选者的引用。大大降低了耦合度。

随时地增加或处理一个请求的结构。增强了给对象指派职责的灵活性。

潜在的问题

一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。