通俗易懂的java设计模式之责任链模式

154 阅读1分钟

首先强调的是责任和链。每一个节点只负责自己需要完成的工作,符合单一职责原则。而链呢强调的是它们是一个整体,信息从第一个节点开始可以向后边的节点进行传递,这些节点是有序的,但要保证构成一条完整的链路。所以它的优点很显然,适合处理一些串行化任务(一定是有序的),常见的拦截器就是如此。但同样,大家都知道串行化是很慢的,所以在处理一些并行化任务(无序的,哪个任务在前哪个任务在后对处理结果并不影响)时更多的要考虑采用并行框架的方式去解决问题。还有就是要保证链路的高可靠性,一定是可以从头到尾的,形成完整一条线。

代码如下:

public class DutyChain {
    public static void main(String[] args) {
        FirstPassHandler firstPassHandler = new FirstPassHandler();//第一关
        SecondPassHandler secondPassHandler = new SecondPassHandler();//第二关
        ThirdPassHandler thirdPassHandler = new ThirdPassHandler();//第三关
        // 和上面没有更改的客户端代码相比,只有这里的set方法发生变化,其他都是一样的
        firstPassHandler.setNext(secondPassHandler);//第一关的下一关是第二关
        secondPassHandler.setNext(thirdPassHandler);//第二关的下一关是第三关
        //从第一个关卡开始
        firstPassHandler.handler();

    }
}
abstract class AbstractHandler {
    /**
     * 下一关用当前抽象类来接收
     */
    protected AbstractHandler next;
    public void setNext(AbstractHandler next) {
        this.next = next;
    }
    public abstract int handler();
}

class FirstPassHandler extends AbstractHandler{
    private int play(){
        return 80;
    }
    @Override
    public int handler(){
        System.out.println("第一关-->FirstPassHandler");
        int score = play();
        if(score >= 80){
            //分数>=80 并且存在下一关才进入下一关
            if(this.next != null){
                return this.next.handler();
            }
        }
        return score;
    }
}

class SecondPassHandler extends AbstractHandler{
    private int play(){
        return 90;
    }
    public int handler(){
        System.out.println("第二关-->SecondPassHandler");

        int score = play();
        if(score >= 90){
            //分数>=90 并且存在下一关才进入下一关
            if(this.next != null){
                return this.next.handler();
            }
        }
        return score;
    }
}
class ThirdPassHandler extends AbstractHandler{
    private int play(){
        return 95;
    }
    public int handler(){
        System.out.println("第三关-->ThirdPassHandler");
        int score = play();
        if(score >= 95){
            //分数>=95 并且存在下一关才进入下一关
            if(this.next != null){
                return this.next.handler();
            }
        }
        return score;
    }
}