责任链模式

1.基本概念

这是一个可以说是过关斩将的设计模式,责任链就像是一道道关卡,你只有闯过了上一关,才能到达下一关继续闯荡。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

2.责任链模式的使用场景

  • 多条件流程判断:权限控制(此处指的是嵌套的循环判断)
  • ERP 系统流程审批:总经理、人事经理、项目经理
  • Java 过滤器的底层实现 Filter

3.结构图

img

  • AbstractHandler抽象责任人类:提供一个抽象类模板供下属责任人实现。有两个部分:其一是连接下一个责任人的对象以及其getter,setter方法;以及具体责任人要做的事情
  • Son具体责任人类:实现抽象责任人类,并后续会连接起来。

4.具体实现

抽象责任人类

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class AbstractHandler {
private AbstractHandler nextAbstractHandler;

public void setNextAbstractHandler(AbstractHandler nextAbstractHandler) {
this.nextAbstractHandler = nextAbstractHandler;
}

public AbstractHandler getNextAbstractHandler() {
return this.nextAbstractHandler;
}

public abstract String checkScore(int score);
}

具体责任人类

1
2
3
4
5
6
7
8
9
10
11
@Component
@Order(0)
public class FirstPass extends AbstractHandler {
@Override
public String checkScore(int score) {
if(score > 60 && this.getNextAbstractHandler() != null) {
return this.getNextAbstractHandler().checkScore(score);
}
return "很遗憾,没有通过第一关";
}
}

记得加上@Component注解之后才能在spring初始化的时候被注入,@Order(0)表示位于该链条的顺序。

初始化类

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
@Component
public class ChainService {

@Autowired
private List<AbstractHandler> abstractHandlerList;

private AbstractHandler abstractHandler;

private static final List<String> SCORE = new ArrayList<>();

@PostConstruct
public void initAbstractHandler() {
for (int i = 0; i < abstractHandlerList.size(); i++) {
if(i == 0) {
abstractHandler = abstractHandlerList.get(0);
} else {
AbstractHandler current = abstractHandlerList.get(i - 1);
AbstractHandler next = abstractHandlerList.get(i);
current.setNextAbstractHandler(next);
}
}
}

public List<String> getScore(int score) {
SCORE.add(abstractHandler.checkScore(score));
return SCORE;
}
}

责任链初始化

首先在spring初始化前准备一个存储责任链模板元素的list集合用来存储责任链元素(列表会自动装配其类型的bean元素)

@PostConstruct注解,将零散的责任链链条组装,成为一个完整的责任链。

还可以用枚举值的方式进行注入