设计模式之责任链模式

概念定义
1
2
3
4
5
6
7
8
菜鸟教程定义:顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
个人理解:责任链模式就是一个请求在多个处理器(就是需要执行各种方法达到需求的java类)之间进行按顺序的执行,他的一个主要优点就是可以手动设置执行的顺序,设置下一个处理器,进行代码上的解耦
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推
场景:
身份认证:可以将身份认证请求传递给不同的认证处理器,例如进行密码验证、指纹验证、证书验证等。
请求拦截与过滤:可以将请求传递给多个过滤器,每个过滤器根据特定条件判断是否拦截请求或继续传递。
购买流程:可以将购买请求传递给不同的处理器,例如库存检查、价格计算、支付处理等
总之,责任链模式适用于有多个处理器可以处理同一类型请求、需要灵活调整处理顺序、需要解耦发送者和接收者、需要保证请求被处理等场景。它可以提高系统的灵活性、可扩展性和可维护性,并降低系统的耦合
代码实现
  1. 责任链模式的一个测试类,这里面就展示了具体是怎么样的一个流程
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
package com.jw.cloud.modulepattern.chain;

/**
* 测试责任链模式:根据不同的请求类型去处理不同的请求
* 当发起一个请求,请求根据处理器的不同进行不同的处理
* 顺序调用请求处理方法 会自动适配什么请求进入什么处理器处理请求
* 比如:有个A、B请求,有X、Y、Z三个处理器,当A请求需要同时处理多个操作,且这些操作
* 顺序不同,执行出来的结果也不同的时候,则建议采用这种设计模式。程序员可以动态的根据不同的业
* 务调整处理器的不同顺序设计出不同的响应效果。然后做具体的响应的只有第一个处理器
*
* @author JoyWu
*/
public class Client {
public static void main(String[] args) {
Handler handlerX = new ConcreteHandlerAddition();
Handler handlerY = new ConcreteHandlerMultiplication();
Handler handlerZ = new ConcreteHandlerDivision();
// 根据不同的处理器顺序处理同一个请求会出现不同的结果
handlerX.setNextHandler(handlerY);
handlerY.setNextHandler(handlerZ);

// 构造请求
Request requestA = new Request();
requestA.setNum1(7);
requestA.setNum2(9);
// 给这个请求做个业务处理,具体执行顺序根据处理器的顺序来定
requestA.setRequestTag("加乘法除法");
handlerX.handleRequest(requestA);
System.out.println("计算结果是:"+requestA.getRes());

// Request requestB = new Request();
// // 说明下,两者请求没有任何的关系的,完全没有任何关系的,只跟处理器有关系
// // 在责任链模式中分别出来请求
//
// // 处理请求
// handlerX.handleRequest(requestB);
}
}

  1. 处理器—–加法
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
package com.jw.cloud.modulepattern.chain;

/**
* 处理器代理(动态代理) 处理加法
* @author JoyWu
*/
public class ConcreteHandlerAddition implements Handler {
private Handler nextHandler;

@Override
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}

@Override
public void handleRequest(Request request) {
// 方式一 需要对请求条件进行过滤的责任链模式 我这里设计的需求是 含有加就进行做加法
if (request.getRequestTag().contains("加")) {
request.setRes(request.getNum1() + request.getNum2()+request.getRes());
if(nextHandler!=null){
nextHandler.handleRequest(request);
}
} else {
System.out.println("No handler can handle the request: " + request.getRequestTag());
}
// 方式二 不需要任何条件的责任链模式,只是需要将请求按操作顺序执行就可以了
// todo 写自己需要的业务

}
}



  1. 处理器—-乘法
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
package com.jw.cloud.modulepattern.chain;

/**
* 处理器接口的具体实现类 处理乘法
* @author JoyWu
*/
public class ConcreteHandlerMultiplication implements Handler {
private Handler nextHandler;

@Override
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}

@Override
public void handleRequest(Request request) {
// 方式一 需要对请求条件进行过滤的责任链模式 我这里设计的需求是 含有乘就进行做乘法
if (request.getRequestTag().contains("乘")) {
request.setRes(request.getNum1() * request.getNum2()*request.getRes());
if(nextHandler!=null){
nextHandler.handleRequest(request);
}
} else {
System.out.println("No handler can handle the request: " + request.getRequestTag());
}
// 方式二 不需要任何条件的责任链模式,只是需要将请求按操作顺序执行就可以了
// todo 写自己需要的业务
}
}
  1. 处理器—-除法
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
package com.jw.cloud.modulepattern.chain;

/**
* 处理器代理(动态代理) 处理除法
* @author JoyWu
*/
public class ConcreteHandlerDivision implements Handler {
private Handler nextHandler;

@Override
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}

@Override
public void handleRequest(Request request) {
// 方式一 需要对请求条件进行过滤的责任链模式 我这里设计的需求是 含有除就进行做除法
if (request.getRequestTag().contains("除")) {
// 假设只是进行除以num1
request.setRes(request.getRes()/request.getNum1());
if(nextHandler!=null){
nextHandler.handleRequest(request);
}
} else {
System.out.println("No handler can handle the request: " + request.getRequestTag());
}
// 方式二 不需要任何条件的责任链模式,只是需要将请求按操作顺序执行就可以了
// todo 写自己需要的业务
}
}



  1. 处理器接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.jw.cloud.modulepattern.chain;

/** 处理器接口
* @author JoyWu
*/
public interface Handler {
/**
* 设置下一个处理器
* @param handler
*/
void setNextHandler(Handler handler);

/**
* 处理请求
* @param request
*/
void handleRequest(Request request);
}

  1. 封装的请求消息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.jw.cloud.modulepattern.chain;

import lombok.Data;

/**
* 请求处理者(即请求处理者来处理一个请求)
* @author JoyWu
*/
@Data
public class Request {
public int num1;
public int num2;
/**
* 计算结果
*
*/
public int res;
/**
* 请求标记,事实上在业务开发中,一个请求肯定有一个特别的标志,告诉你这个请求接下来要干什么
*/
public String requestTag;
}

计算结果

上述代码通过设置不同的执行顺序,可以得到不同的计算结果

责任链模式1

责任链模式2

总结

这个设计模式的用法以及定义都在前面阐述了,实际上需不需在公司项目用到这个设计模式,是根据实际情况来的,不能强行去使用设计模式噢!!!