责任链模式

56 阅读1分钟

责任链模式可以对一个流程的各个环节进行解耦,每个环节放在一个handler中,依据这些环节的执行顺序,相应的handler组成单向不循环链表。

public abstract class AbstractHandler {

    protected AbstractHandler nextHandler;

    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     *
     * @param x
     * @return 此示例中设置的返回逻辑如下:
     * 1. 设handler的序号为 i,其中 i = 1, 2, 3,..., n
     * 2. 当输入 x 进入第 i 个处理程序时:
     *    2.1 若未满足“传递”条件,则返回当前handler的序号 i。
     *    2.2 否则:
     *       2.2.1 若 i < n,则进入第 (i + 1) 个handler并返回 i + 1。
     *       2.2.2 若 i = n,则返回 i + 1。// x 已通过所有handler。
     */
    public abstract int handle(int x);
}
public class FirstHandler extends AbstractHandler {

    private int getData() {
        return 60;
    }

    private int level = 1;

    @Override
    public int handle(int x) {
        int data = getData();
        if (x >= data) {
            if ( null != this.nextHandler ) {
                return this.nextHandler.handle(x);
            }
        }
        return level;
    }
}
public class SecondHandler extends AbstractHandler {

    private int getData() {
        return 75;
    }

    int level = 2;
    @Override
    public int handle(int x) {
        int data = getData();

        if (x >= data) {
            if ( null != this.nextHandler ) {
                return this.nextHandler.handle(x);
            }
        }

        return level;
    }
}
public class ThirdHandler extends AbstractHandler {

    private int getData() {
        return 90;
    }

    private int level = 3;

    @Override
    public int handle(int x) {

        int data = getData();

        if (x >= data) {
            if ( null != this.nextHandler ) {
                this.nextHandler.handle(x);
            } else {
                return level + 1;
            }
        }

        return level;
    }
}
public class HandlerClient {
    public static void main(String[] args) {

        FirstHandler firstHandler = new FirstHandler();
        SecondHandler secondHandler = new SecondHandler();
        ThirdHandler thirdHandler = new ThirdHandler();

        firstHandler.setNextHandler(secondHandler);
        secondHandler.setNextHandler(thirdHandler);

        Random random = new Random();
        for ( int i=0; i<50; i++ ) {
            //  生成一个 0 到 99 之间的随机整数
            int x = random.nextInt(101);
            System.out.println("x=" + x + " result=" + firstHandler.handle(x));
        }

    }
}

如果在某个handler执行失败,则返回该环节执行失败的相应信息;否则进入下一个handler继续执行。如果末端handler也正常执行完毕,那么也就意味着这一段业务流程完整且成功地执行了一次。