责任链设计模式是一种解耦请求发送者和接收者的处理机制,属于行为型设计模式。它将多个处理单元链接成一条链,在链中按顺序传递请求直至被处理或达到链尾。该模式广泛应用在日志记录、权限验证、请求过滤等领域。
允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
责任链模式主要是解耦了请求与处理,客户只需将请求发送到链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递直至有节点对象进行处理。


public class Request {
/**
* 类别
*/
private String requestType;
/**
* 金额
*/
private int money;
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
public enum RequestType {
/**
* 转账
*/
TRANSFER,
/**
* 提现
*/
CASH_OUT;
}
public abstract class RiskControlManager {
protected String name;
/**
* 更严格的风控策略
*/
protected RiskControlManager superior;
public RiskControlManager(String name){
this.name = name;
}
/**
* 设置更严格的风控策略
* @param superior
*/
public void setSuperior(RiskControlManager superior){
this.superior = superior;
}
/**
* 处理请求
* @param request
*/
public abstract void handlerRequest(Request request);
}
public class FirstRiskControlManager extends RiskControlManager {
public FirstRiskControlManager(String name) {
super(name);
}
/**
* 1000元以内可以直接处理
* @param request
*/
@Override
public void handlerRequest(Request request) {
if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()<=1000){
System.out.println("普通操作,输入支付密码即可");
System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
}else {
//下个节点进行处理
if(superior!=null){
superior.handlerRequest(request);
}
}
}
}
public class SecondRiskControlManager extends RiskControlManager {
public SecondRiskControlManager(String name) {
super(name);
}
/**
* 处理 1千到1万之间
* @param request
*/
@Override
public void handlerRequest(Request request) {
if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>1000 && request.getMoney()<10000){
System.out.println("稍大额操作,输入支付密码+短信验证码即可");
System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
}else {
//下个节点进行处理
if(superior!=null){
superior.handlerRequest(request);
}
}
}
}
public class ThirdRiskControlManager extends RiskControlManager {
public ThirdRiskControlManager(String name) {
super(name);
}
@Override
public void handlerRequest(Request request) {
if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>10000){
System.out.println("大额操作,输入支付密码+验证码+人脸识别 ");
System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
}else {
//下个节点进行处理
if(superior!=null){
superior.handlerRequest(request);
}
}
}
}
public static void main(String[] args) {
RiskControlManager firstControlManager = new FirstRiskControlManager("初级风控");
RiskControlManager secondControlManager = new SecondRiskControlManager("中级风控");
RiskControlManager thirdControlManager = new ThirdRiskControlManager("高级风控");
//形成调用链
firstControlManager.setSuperior(secondControlManager);
secondControlManager.setSuperior(thirdControlManager);
//使用
Request request1 = new Request();
request1.setRequestType(RequestType.CASH_OUT.name());
request1.setMoney(21000);
firstControlManager.handlerRequest(request1);
}

