前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式-责任链模式】

【设计模式-责任链模式】

作者头像
Liusy
发布2020-09-01 16:27:33
4520
发布2020-09-01 16:27:33
举报
文章被收录于专栏:Liusy01

【导读】当有问题需要请教时,咨询别人,当其处理不了的时候,就咨询另外一个人,直到有人能处理此问题。这个就是典型的责任链模式。

一、定义

为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

二、实例

比如日常报销流程,一般流程是先填写报销单,然后直系领导审批,通过之后是财务部审批。如果有一层审批不通过,则直接打回。

报销单对象:

代码语言:javascript
复制
public class ExpenseAccount {

    //发票
    private String invoice;

    //报销单
    private String expenseAccount;

    public ExpenseAccount(String invoice, String expenseAccount) {
        this.invoice = invoice;
        this.expenseAccount = expenseAccount;
    }

}

抽象审批者:

代码语言:javascript
复制
public abstract class Approver {

    protected Approver approver;

    1、设置下一个审批者
    public void setNextApprover(Approver approver){
        this.approver = approver;
    }

    2、判断是否有下一个审批人
    public boolean hasNextApprover(){
        if (null == approver) {
            return false;
        }
        return true;
    }

    abstract void doApprover(ExpenseAccount expenseAccount);

}

直系领导审批:

代码语言:javascript
复制
public class DirectLeaderApprover extends Approver {


    @Override
    public void doApprover(ExpenseAccount expenseAccount) {
        if (!StringUtils.isEmpty(expenseAccount.getInvoice()) 
            && !StringUtils.isEmpty(expenseAccount.getExpenseAccount())) {
            System.out.println("直系领导审批通过");
            if (hasNextApprover()) {
                getNextApprover().doApprover(expenseAccount);
            }else {
                System.out.println("报销成功,流程结束");
            }
        } else {
            System.out.println("直系领导审批不通过,流程结束");
        }
    }
}

财务部审批:

代码语言:javascript
复制
public class AccountingApprover extends Approver {

    @Override
    public void doApprover(ExpenseAccount expenseAccount) {
        if (!StringUtils.isEmpty(expenseAccount.getInvoice()) && !StringUtils.isEmpty(expenseAccount.getExpenseAccount())) {
            System.out.println("财务部审批通过");
            if (hasNextApprover()) {
                getNextApprover().doApprover(expenseAccount);
            }else {
                System.out.println("报销成功,流程结束");
            }
        } else {
            System.out.println("财务部审批不通过,流程结束");
        }
    }
}

测试类:

代码语言:javascript
复制
public static void main(String[] args) {
        Approver directLeader = new DirectLeaderApprover();
        Approver accounting = new AccountingApprover();

        directLeader.setNextApprover(accounting);

        ExpenseAccount expenseAccount = new ExpenseAccount("发票","报销单");

        directLeader.doApprover(expenseAccount);
    }

运行结果:

三、源码实例

(1)JDK的过滤器Filter就是典型的过滤器模式

代码语言:javascript
复制
public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Liusy01 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档