一:责任链模式介绍
责任链模式(Chain of Responsibility)是Web项目中最经常用到的一个设计模式,比如有一个作业任务,先有一个对象对其负责处理,之后又交给其他的一个对象处理,一次传递下去,这是最通俗最简单的责任链模式的应用。
二:案例
假如客户买了某公司的一个产品,可是发现产品出了问题,于是打电话到部门A询问,部门A告诉他去问一下部门B,部门B再让他问一下部门C......
以此类推,最后部门Z终于给他解决了问题。
下面贴一下实现的代码,首先要有一系列的部门,这些部门就是责任链上的一系列类。
第一个是部门的基类:
1
/**
2
* 部门基类<br>
3
*
4
*/
5
public abstract class Department {
6
7
protected Department successor;
8
9
/**
10
* 处理方法,调用此方法处理请求
11
*/
12
public abstract void handleRequest();
13
14
/**
15
* 赋值方法,调用此方法设置下家
16
*
17
* @param successor
18
*/
19
public void setSuccessor(Department successor) {
20
this.successor = successor;
21
}
22
23
/**
24
* 取值方法,得到下家对象
25
*
26
* @return
27
*/
28
public Department getSuccessor() {
29
return successor;
30
}
31
}

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

后边的部门子类都要继承这个类,然后覆盖handleRequest方法去处理用户请求,另外,successor是指如果这个部门不能处理的话,将请求转接给的下一个部门。
然后来看一个用户请求的抽象,部门的具体实现会用到,这里先列出来。这个类本质上不是cor的一个组成部分。
1
/**
2
* 客户发出的请求类型<br>
3
*
4
*/
5
public class Request {
6
public enum RequestType {
7
/** 产品错误 */
8
ProductError,
9
/** 功能使用 */
10
FunctionUsage,
11
/** 其他请求 */
12
Others
13
}
14
15
private RequestType type;
16
17
public Request(RequestType type) {
18
this.type = type;
19
}
20
21
public RequestType getType() {
22
return type;
23
}
24
25
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

下面来看几个部门的具体实现:







































最后是调用它的客户端代码:
1
public class Client {
2
3
/**
4
* @param args
5
*/
6
public static void main(String[] args) {
7
Department sales = new SalesDepartment();
8
Department develop = new DevelopDepartment();
9
10
sales.setSuccessor(develop);
11
12
Request funcReq = new Request(Request.RequestType.FunctionUsage);
13
Request errorReq = new Request(Request.RequestType.ProductError);
14
Request otherReq = new Request(Request.RequestType.Others);
15
16
sales.handleRequest(funcReq);
17
sales.handleRequest(errorReq);
18
sales.handleRequest(otherReq);
19
}
20
21
}
这样,一个完整的责任链例子就写完了。 
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
