责任链设计模式

责任链模式是将请求和处理进行分离,处理请求的对象可由多个节点完成,多个节点连接成一条链,当某个节点处理不了请求时就会将请求传递给下个节点去处理,如果可以处理就直接结束。主要涉及3个角色:

  • 抽象责任链节点:是一个抽象类,包含下个节点的引用和处理请求的抽象方法。
  • 具体实现节点:抽象责任链节点的具体实现,实现处理请求的具体业务逻辑。
  • 客户端:构建节点链条,发送请求,责任链首节点开始处理请求。

示例

已请假审批为例,员工请假首先要到组长那去审批,一般请假天数<=3天组长可以审批,如果请假天数<=5天总监可以审批,请假天数<=7天得部长审批,超过了7天直接被驳回。对于组长、总监、部长可以构建责任链,请假审批可以视为处理请求。

// 抽象责任链节点
public abstract class Handler {
    // 下一个节点
    private Handler nextHandler;

    // 处理请求
    protected abstract void handleRequest(int days);

    public Handler getNextHandler() {
        return nextHandler;
    }

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

// 组长节点
public class PmHandler extends Handler {
    @Override
    protected void handleRequest(int days) {
        if (days <= 3) {
            System.out.println("组长同意了请假审批!");
        } else {
            if (getNextHandler() != null) {
                getNextHandler().handleRequest(days);
            } else {
                System.out.println("请假天数太多被驳回!");
            }
        }
    }
}

// 总监节点
public class DirectorHandler extends Handler {
    @Override
    protected void handleRequest(int days) {
        if (days <= 5) {
            System.out.println("总监同意了请假审批!");
        } else {
            if (getNextHandler() != null) {
                getNextHandler().handleRequest(days);
            } else {
                System.out.println("请假天数太多被驳回!");
            }
        }
    }
}

// 部长节点
public class MinistorHandler extends Handler {
    @Override
    protected void handleRequest(int days) {
        if (days <= 7) {
            System.out.println("部长同意了请假审批!");
        } else {
            if (getNextHandler() != null) {
                getNextHandler().handleRequest(days);
            } else {
                System.out.println("请假天数太多被驳回!");
            }
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Handler pmHandler = new PmHandler();
        Handler directorHandler = new DirectorHandler();
        Handler ministorHandler = new MinistorHandler();

        // 构建链条
        pmHandler.setNextHandler(directorHandler);
        directorHandler.setNextHandler(ministorHandler);

        // 处理请假请求
        pmHandler.handleRequest(2);
        pmHandler.handleRequest(5);
        pmHandler.handleRequest(7);
        pmHandler.handleRequest(10);
    }
}

运行结果如下:


责任链模式.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容