责任链模式Responsibility

一 概述

其核心是为了处理某种连续的流程,并确保业务一定能走到相应的责任节点上并得到相应的处理;
例如工作流:企事业单位中为了完成某项日常任务,通常要制定一些工作流程,按步骤拆分,并组织好各个环节中的逻辑关系及走向,这样才能更高效、更规范地完成任务;

二 使用示例

审批工作流:
审批人的抽象:不同审批人的审批权限不同,审批的逻辑由其实现类实现,抽象类抽象不同角色的责任范围,自己并不知道不属于自己责任范围内的业务:自己只懂自己怎么审批(责任),自己处理不了的递交给上层(链条);

package cn.http.test;

/**
 * 抽象类:审批人员/审批权限
 *
 * @author:wjm
 * @date:2020/6/28 22:00
 */
public abstract class Approver {
    /**
     * 审批人名字
     */
    protected String name;

    /**
     * 下一个审批人(不同角色的自己相互持有引用)
     */
    protected Approver nextApprover;

    /**
     * 创建审批人
     *
     * @param name
     */
    public Approver(String name) {
        this.name = name;
    }

    /**
     * 设置下一个审批人
     *
     * @param nextApprover
     * @return
     */
    protected Approver setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
        // 返回下个审批人,可以使用下个审批人的方法
        return nextApprover;
    }

    /**
     * 抽象审批方法:审批金额<p>
     * 金额在1000元以下的,由基层人员审批;<p>
     * 金额在1000元以上,5000元以下的,由管理人员审批;<p>
     * 金额在5000元以上的,由CEO审批;
     *
     * @param amount
     */
    public abstract void approve(int amount);
}
package cn.http.test;

/**
 * 具有审批权限的基层人员
 *
 * @author:wjm
 * @date:2020/6/28 22:10
 */
public class BasicWorker extends Approver {
    public BasicWorker(String name) {
        super(name);
    }

    @Override
    public void approve(int amount) {
        if (amount <= 1000) {
            System.out.println("【员工:" + name + "】:审批通过...");
        } else {
            System.out.println("【员工:" + name + "】:无权审批,升级处理...");
            this.nextApprover.approve(amount);
        }
    }
}
package cn.http.test;

/**
 * 具有审批权限的管理人员
 *
 * @author:wjm
 * @date:2020/6/28 22:10
 */
public class Manager extends Approver {
    public Manager(String name) {
        super(name);
    }

    @Override
    public void approve(int amount) {
        if (amount <= 5000) {
            System.out.println("【经理:" + name + "】:审批通过...");
        } else {
            System.out.println("【经理:" + name + "】:无权审批,升级处理...");
            this.nextApprover.approve(amount);
        }
    }
}
package cn.http.test;

/**
 * 具有审批权限的Ceo
 *
 * @author:wjm
 * @date:2020/6/28 22:10
 */
public class Ceo extends Approver {
    public Ceo(String name) {
        super(name);
    }

    @Override
    public void approve(int amount) {
        if (amount <= 10000) {
            System.out.println("【CEO:" + name + "】:审批通过...");
        } else {
            System.out.println("【CEO:" + name + "】:驳回申请...");
        }
    }
}

至此,申请人与审批人实现了解耦,我们只需递单送给责任链即可,申请人不必再关心每个处理细节;

package cn.http.test;

/**
 * 应用
 *
 * @author:wjm
 * @date:2020/6/28 22:14
 */
public class Test {
    public static void main(String[] args) {
        //创建一个审批人
        Approver basicWorkerApprover = new BasicWorker("基层人员A");

        /**
         * 审批人具有的责任链:<p>
         */
        basicWorkerApprover.setNextApprover(new Manager("管理人员A")).setNextApprover(new Ceo("CeoA"));

        basicWorkerApprover.approve(1000);
        basicWorkerApprover.approve(6000);
        basicWorkerApprover.approve(10000);
        basicWorkerApprover.approve(12000);
    }
}

三 总结

在责任链模式中,各个角色的责任划分非常明确并且被分开定义到了每个角色类中,再把他们串起来去调用;后期如果再继续添加新的角色只需要添加新角色类并加入链条即可;责任链条具有随意伸缩,灵活的可伸缩性,完美的可扩展性;

四 类UML图

责任链模式

源码地址:我的GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值