My logo
Published on

chain of responsibility 责任链模式

场景:

  1. 现在在某一个地方的业务流程,要执行功能1、功能2、功能3
  2. 现在在另外一个地方的业务流程,是要先执行功能3,然后执行功能1和功能2

什么时候用责任链模式呢?很简单,就是如果你需要动态组装一个业务流程出来,流程中的每个handler业务逻辑需要复用,那就用责任链模式。

一般模式:

package wang.jinggo.basics.zhss.chain;

/**
 * @author: wangyj
 * @create: 2021-10-25
 * @version: 1.0.0
 **/
public class WithoutChainPatternDemo {


    public static void main(String[] args) {
        // 业务流程1
        System.out.println("执行功能1");
        System.out.println("执行功能2");
        System.out.println("执行功能3");

        // 业务流程2
        System.out.println("执行功能3");
        System.out.println("执行功能1");
        System.out.println("执行功能2");

        // 有什么问题?
        // 第一个,大量的重复代码出现了,功能123的代码,都出现在了两个地方,有复制粘贴的现象
        // 如果说,现在要对某个功能的代码进行修改,那么就会很麻烦,要在多个地方去修改这个功能的代码
        // 另外一个问题是说,如果现在要对某个业务流程的顺序进行调整或者改造,很麻烦,要去修改大量的代码
    }
}

设计模式:

package wang.jinggo.basics.zhss.chain;

/**
 * @author: wangyj
 * @create: 2021-10-25
 * @version: 1.0.0
 **/
public class ChainPatternDemo {

    public static void main(String[] args) {
        // 业务流程1
        Handler thirdHandler = new Handler3(null);
        Handler secondHandler = new Handler2(thirdHandler);
        Handler firstHandler = new Handler1(secondHandler);
        firstHandler.execute();

        // 业务流程2
        thirdHandler = new Handler3(null);
        secondHandler = new Handler1(thirdHandler);
        firstHandler = new Handler2(secondHandler);
        firstHandler.execute();

        // 责任链的思想
        // 1:将一个业务流程中的多个步骤拆分开来,每个步骤封装到一个handler处理器中去
        // 2:支持业务流程基于handler动态组装,不同的业务流程 -> handler代表的代码组件可以复用

        // 好处1:将这个代码封装到一个handler中,后面如果要对某个步骤的代码逻辑调整,修改一个handler即可
        // 好处2:如果业务流程要修改,那么不需要拷贝大量的代码,只要基于handler动态组装业务流程即可

        // 面向的场景
        // 就是有多个业务流程,这些业务流程之间有相同的代码逻辑和步骤
        // 可以用责任链模式来实现
    }

    public static abstract class Handler {

        protected Handler successor;

        public Handler(Handler successor) {
            this.successor = successor;
        }

        public abstract void execute();

    }

    public static class Handler1 extends Handler {

        public Handler1(Handler successor) {
            super(successor);
        }

        public void execute() {
            System.out.println("执行功能1");
            if (successor != null) {
                successor.execute();
            }
        }

    }

    public static class Handler2 extends Handler {

        public Handler2(Handler successor) {
            super(successor);
        }

        public void execute() {
            System.out.println("执行功能2");
            if (successor != null) {
                successor.execute();
            }
        }

    }

    public static class Handler3 extends Handler {

        public Handler3(Handler successor) {
            super(successor);
        }

        public void execute() {
            System.out.println("执行功能3");
            if (successor != null) {
                successor.execute();
            }
        }

    }

}