Earth Guardian

You are not LATE!You are not EARLY!

0%

设计模式--行为型:责任链模式

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

责任链模式

责任链模式 Chain of Responsibility[rɪˌspɑ:nsəˈbɪləti] Pattern:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。也常用来替代各种分支和条件判断语句。

类图结构

0062-ChainOfResonsibility-uml-classdiag.png

结构解析

  • Handler
    抽象类,申明一个请求处理的方法,并持有下一个处理对象的引用。
  • ConcreteHandler
    实现类,实现请求,如果无法处理转发给下一个继任者处理。

示例

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
// 1. Handler
public abstract class Handler {
protected Handler successor;

public void setSuccessor(Handler successor){
this.successor = successor;
}

public abstract void handleRequest(int request);
}

// 2. ConcreteHandler
public class ConcreteHandler1 extends Handler{
@Override
public void handleRequest(int request) {
if (request > 0 && request < 3){
System.out.println("ConcreteHandler1: TeamLead approve: "
+ request + " days leave.");
}else if (successor != null){
successor.handleRequest(request);
}
}
}

public class ConcreteHandler2 extends Handler{
@Override
public void handleRequest(int request) {
if (request > 3 && request < 7){
System.out.println("ConcreteHandler1: Manager approve: "
+ request + " days leave.");
}else if (successor != null){
successor.handleRequest(request);
}
}
}

public class ConcreteHandler3 extends Handler{
@Override
public void handleRequest(int request) {
if (request > 7){
System.out.println("ConcreteHandler1: Boss approve: "
+ request + " days leave.");
}
}
}

// 3. Test
public class TestChainOfResponsibility {
public static void main(String[] args) {
Handler teamLead = new ConcreteHandler1();
Handler manager = new ConcreteHandler2();
Handler boss = new ConcreteHandler3();
teamLead.setSuccessor(manager);
manager.setSuccessor(boss);

teamLead.handleRequest(5);
}
}

// 4. Result
ConcreteHandler1: Manager approve: 5 days leave.

总结

当客户提交一个请求时,请求时沿着链传递到一个具体的 ConcreteHandler 对象负责并处理它。在 Android 中常见的责任链模式就是 View 按键事件分发机制。

参考文档

  • 大话设计模式
  • Android 源码设计模式解析与实战