设计模式-责任链模式

责任链通常需要先建立一个单向链表,然后调用方只需要调用头部节点就可以了,后面会自动流转下去。比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了

定义抽象处理对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class AbstractHander {

/**
* 下一个节点
*/
protected AbstractHander nextHandler;

/**
* 本节点的处理方法
* @param days
*/
public abstract void handle(int days);

/**
* 给本节点设置后继节点
* @param nextHandler
*/
public void setNextHandler(AbstractHander nextHandler) {
this.nextHandler = nextHandler;
}
}

定义具体处理对象

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
public class HandlerA extends AbstractHander {

@Override
public void handle(int days) {

if(days < 5){
System.out.println("**条件符合,由A自己处理这个请求");
}else{
System.out.println("##条件不符合,由A转发这个请求到下一个处理者");
if(nextHandler != null){
nextHandler.handle(days);
}
}

}
}
public class HandlerB extends AbstractHander {

@Override
public void handle(int days) {

if(days < 10){
System.out.println("**条件符合,由B自己处理这个请求");
}else{
System.out.println("##条件不符合,由B转发这个请求到下一个处理者");
if(nextHandler != null){
nextHandler.handle(days);
}
}

}
}
public class HandlerC extends AbstractHander {

@Override
public void handle(int days) {
if(days < 15){
System.out.println("**条件符合,由C自己处理这个请求");
}else{
System.out.println("##条件不符合,由C转发这个请求到下一个处理者");
if(nextHandler != null){
nextHandler.handle(days);
}
}
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
//初始化责任链
HandlerA handlerA = new HandlerA();
HandlerB handlerB = new HandlerB();
HandlerC handlerC = new HandlerC();
handlerA.setNextHandler(handlerB);
handlerB.setNextHandler(handlerC);

//交给链表表头处理
handlerA.handle(13);
}
输出
##条件不符合,由A转发这个请求到下一个处理者
##条件不符合,由B转发这个请求到下一个处理者
**条件符合,由C自己处理这个请求
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×