设计模式之责任链模式

责任链模式的定义

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

责任链模式重点就在链上,就好像击鼓传花一样,请求会在这个链上传递,在传递的过程中处理。

举个栗子

责任链模式的模型图

下面是具体编码

  • 处理者抽象类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class Handler {
//下一处理者
private Handler next;
public final Response handleRequest(Request request){
Response response=null;
//判断是否为自己处理级别
if (getHandlerLevel().equals(request.getRequestLevel())){
response=operate(request);
}else {
if (next!=null){
response=next.handleRequest(request);
}else {

}
}
return response;
}
public void setNext(Handler next) {
this.next = next;
}
protected abstract Level getHandlerLevel();
//处理
protected abstract Response operate(Request request);
}
  • 处理者实现
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
public class ConcreteHandler1 extends Handler {
@Override
protected Level getHandlerLevel() {
//设置处理级别
return null;
}
@Override
protected Response operate(Request request) {
//处理逻辑
return null;
}
}
public class ConcreteHandler2 extends Handler {
@Override
protected Level getHandlerLevel() {
//设置处理级别
return null;
}
@Override
protected Response operate(Request request) {
//处理逻辑
return null;
}
}
public class ConcreteHandler3 extends Handler {
@Override
protected Level getHandlerLevel() {
//设置处理级别
return null;
}
@Override
protected Response operate(Request request) {
//处理逻辑
return null;
}
}
  • 请求
1
2
3
4
5
6
public class Request {
public Level getRequestLevel() {
//请求等级
return null;
}
}
  • 结果
1
2
3
public class Response {
//处理结果
}
  • 级别
1
2
3
public class Level {
//请求和处理等级
}
  • 调用场景
1
2
3
4
5
6
7
8
9
10
11
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
//按照123顺序处理
handler1.setNext(handler2);
handler2.setNext(handler3);
Response response = handler1.handleRequest(new Request());
}
}

这样就完成了一条责任链的实现,一个请求传过来,逐级处理,非常方便,代码也不难理解。

适用范围

责任链模式可以用在逐级处理或者追加逻辑的场景里,由于责任链条是自由组合的,连接起来非常方便,自由组合度也很高。

优点缺点

责任链模式的优点在于请求和结果是分开的,请求者不必关心处理者,责任链是一个整体,不需要关心细节,有助于解耦。

责任链模式的缺点一方面是性能问题,一条整的责任链必须遍历一遍才能得到结果,另一方面是调试的不方便,不容易排查某一个节点的问题。

注意事项

只用责任链模式要注意不要太长,要学会控制责任链的复杂程度,否则会严重影响性能。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!