责任链模式: 责任链的核心是通过模板方法定义处理请求,从而使多个对象都有机会处理请求,避免请求与发送者和接受者之间的耦合关系,并将这些对象串成一条链在这个链上有机会处理请求;

 

由此可见,责任链的关键在于模板方法,以及next对象,如何处理这个链,是否处理四个关键要素

其核心代码如下:调用时可以采用另外一个类定义chain结构【设置next】,链上第一个节点调用template,从而启动链式处理

public abstart class Chain{
private Chain next;
public void template(Request request){
if(ifProcess(request)){
process(request);
}else{
if(next != null){
next.template(request);
}else{
// 链上无人处理 自定义最终处理方式
}
}
}
public abstart boolean ifProcess(Request request);
public abstart void process(Request request);
}

责任链的优点是封装了业务处理,解耦请求发送者和处理接受者,同时链节点之间解耦了请求处理业务,实现单一职责原则

责任链的缺点是遍历链式调用,存在性能问题,递归过深出现栈溢出

责任链比较好的业务场景是请求者存在多个处理者,处理者也可以动态变化,请求者不关注处理者本身只关注处理结果即可

比如第三方支付,支付对接多个银行,责任链可以处理决定对接哪个银行

 

另外,责任链模式可以有很多变种,变种的关键在于模板方法的定义:比如增加反向逻辑,读者可以思考其他扩展

public  void  boBizAndSend(T datafromMq){
if( shouldProcess(datafromMq)){
try {
ifDoBiz(datafromMq);
} catch (Exception e) {
}
}else {
try {
ifNotBiz(datafromMq);
} catch (Exception e) {
}
}
if(next != null && transfer){
next.boBizAndSend(datafromMq);
}
}
public abstract boolean shouldProcess(T datafromMq);
protected abstract void ifDoBiz(T datafromMq);

/**
* 反向业务逻辑补充
* @param datafromMq
*/
protected abstract void ifNotBiz(T datafromMq);