责任链模式

2021-05-02   


责任链模式

场景

  最近发现了项目中有这么一块代码逻辑。业务A的调用链:方法A->方法B->方法C;业务B的调用链:方法D->方法B->方法C;业务员C的调用链:方法A->方法E。似乎所有的公用方法拆分了出来,但是整个业务中每一个方法都依赖于上一个方法的正确执行并且没有一个正确的状态迁移。似乎可以用一种设计模式来优化?

简介

  责任链模式:一种行为设计模式,它允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理或将其传递给链上的下个处理者。发送请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

demo
  1. 抽象处理器
public abstract class Handler {

    private Handler next;

    /**
     * 当前节点业务处理
     *
     * @param str 业务参数
     * @return
     */
    public abstract Object doSomeThing(String str);

    /**
     * 设置链的下一个处理者
     *
     * @param handler
     * @return
     */
    public Handler link(Handler handler) {
        this.next = handler;
        return handler;
    }

    /**
     * 下一个处理者业务处理
     *
     * @param str 业务参数
     * @return
     */
    public Object doSomeThingNext(String str) {
        if (next == null) {
            return str;
        }
        return next.doSomeThing(str);
    }

}
  1. 处理器不同实现
public class FirstHandler extends Handler {
    
    @Override
    public Object doSomeThing(String str) {
        //todo
        str = str + " first study";
        return doSomeThingNext(str);
    }
    
}

public class SecondHandler extends Handler {

    @Override
    public Object doSomeThing(String str) {
        //todo
        str = str + " second study++";
        return doSomeThingNext(str);
    }

}

public class ThirdHandler extends Handler {

    @Override
    public Object doSomeThing(String str) {
        //todo
        str = str + " third study!!!";
        return doSomeThingNext(str);
    }

}
  1. 组装链式调用
public class HandlerTest {
    public static void main(String[] args) {
        Handler handler = new FirstHandler();
        handler.link(new SecondHandler()).link(new ThirdHandler());
        Object o = handler.doSomeThing("rin");
        System.out.println(o.toString());
    }
}
  1. 结果
rin first study second study++ third study!!!
其他

责任链模式还有其他实现形式,合适的才是最好的。还是推荐阅读
https://refactoringguru.cn/design-patterns/chain-of-responsibility

Q.E.D.