首页 > 其他分享 >设计模式之责任链

设计模式之责任链

时间:2022-08-20 15:22:22浏览次数:40  
标签:nextApprover money void Approver 责任 审批 设计模式 public

概述

责任链模式(Chain of Responsibility Pattern)属于行为型设计模式。它为请求创建了一个处理链条,这个链条上的所有对象都要对这个请求进行处理。比如我们生活中经常使用的审批流程,当每一个节点审批通过后,发送给下一个节点,如:开发小组长->部门领导->总经理。也可以和java中的链表进行类比。

使用场景

  1. 当一个请求需要进行一系列的处理的时候,如:数据处理过程需要进行数据抽取、清洗、转换、存储

如何实现

以审批流程为例,如何进行抽象设计:

  1. 所有对象都具有审批行为,将其作为一个抽象方法doApproval()
  2. 所有对象都具有传递行为,将需要审批的单据传递给下一个审批人。而传递的逻辑都是一样的,所以将传递行为定义为一个默认的方法delivery()
  3. 既然需要传递,那么就要知道下一个审批人是谁。所以将下一个审批人作为一个成员属性

代码示例

/**
 * 审批人抽象
 */
public abstract class Approver {

    private Approver nextApprover;

    /**
     * 审批逻辑
     * @param money
     */
    abstract void doApproval(int money);

    /**
     * 责任链传递方法
     * @param money
     */
    protected void delivery(int money) {
        if (nextApprover == null) {
            System.out.println("结束::没有下一个审批人了");
        } else {
            nextApprover.doApproval(money);
        }
    }

    public Approver getNextApprover() {
        return nextApprover;
    }

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }
}
/**
 * 小组长审批实现
 */
public class TeamLeaderApprover extends Approver {

    @Override
    public void doApproval(int money) {
        if (money <= 5000) {
            System.out.println("TeamLeader::审批通过::交给下一个审批人");
        } else {
            System.out.println("TeamLeader::没有权限::交给下一个审批人");
        }
        this.delivery(money);
    }
}
/**
 * 部门领导审批实现
 */
public class DeptLeaderApprover extends Approver {

    @Override
    public void doApproval(int money) {
        if (money <= 10000) {
            System.out.println("DeptLeader::审批通过::交给下一个审批人");
        } else {
            System.out.println("DeptLeader::没有权限::交给下一个审批人");
        }
        this.delivery(money);
    }
}
/**
 * CEO审批实现
 */
public class CEOApprover extends Approver {

    @Override
    public void doApproval(int money) {
        if (money <= 20000) {
            System.out.println("CEO::这么点钱用不着审批::交给下一个审批人");
        } else {
            System.out.println("CEO::审批通过::交给下一个审批人");
        }
        this.delivery(money);
    }
}
/**
 * 测试
 */
public class ChainTest {

    public static void main(String[] args) {
        TeamLeaderApprover teamLeaderApprover = new TeamLeaderApprover();
        DeptLeaderApprover deptLeaderApprover = new DeptLeaderApprover();
        CEOApprover ceoApprover = new CEOApprover();

        //给当前审批人设置下一个审批人
        teamLeaderApprover.setNextApprover(deptLeaderApprover);
        deptLeaderApprover.setNextApprover(ceoApprover);

        //执行审批行为,自动传递
        teamLeaderApprover.doApproval(10000);
    }
}

运行结果

TeamLeader::没有权限::交给下一个审批人
DeptLeader::审批通过::交给下一个审批人
CEO::这么点钱用不着审批::交给下一个审批人
结束::没有下一个审批人了

框架源码中的应用

  1. javax.servlet包中的Filter接口

总结

优点

  1. 将请求发送者和接受者解耦
  2. 增加新的请求处理类很方便
  3. 可以灵活的安排链条中每个节点的顺序或删除某一个节点

缺点

  1. 当链条过长时会对系统性能造成一定影响
  2. 不能保证请求一定被接收,因为请求发送过去之后没有反馈

标签:nextApprover,money,void,Approver,责任,审批,设计模式,public
From: https://www.cnblogs.com/yywf/p/16607621.html

相关文章

  • 设计模式-单例模式
    单例模式:简单地说就是一个实例即一个对象,全局只用这一个对象。如何保证一个对象呐?私有的构造函数,保证外界不能直接new一个对象,那么就保证了单一性;但......
  • java中23种设计模式
    一、设计模式分类1.设计模式分类  2.设计模式特点单例模式:某个类只能有一个实例,提供一个全局的访问点。简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类......
  • 责任链模式
    1.定义是一种处理请求的模式,它让多个处理器都有机会处理该请求,直到其中某个处理成功为止。责任链模式把多个请求处理器串成链,然后让请求在链上传递。2.类图  3.例子......
  • 设计模式学习(4)分开考虑
    桥接模式将类功能的层次结构和实现结构分离开实现层次结构:在模板方法模式中,我们通过重写父类的方法来达到实现自己的功能的目的。这里使用的继承只是子类为了在父类的接......
  • 23设计模式 24 visitor 访问者模式
      有这样一种情况,看一个视频  用户分   normal, VIP,SVIP   abstract User {}Normal:UserVIP:UserSVIP :User  在子类中override User......
  • 【总结笔记】设计模式
    工厂模式介绍https://zhuanlan.zhihu.com/p/83535678工厂模式利用C++多态的特性,将存在继承关系的类,通过一个工厂类创建对应的子类对象。工厂模式可分别实现为简单工厂......
  • 设计模式学习(3)生成实例
    单例模式这个太简单了,贴一下代码吧publicclassSingleton{privatestaticSingletonsingleton=newSingleton();publicstaticSingletongetInstance(){......
  • 找出对应的设计模式-优化下面的场景开发。
    packagecom.iit.observer;//研究性的作业://业务场景:(到了吃饭时间)管理员就调用sendMsg方法,//需要向Cat和Dog发送一条消息。//发布,关注(订阅):Cat和Dog关注......
  • 设计模式22 state状态模式
       状态模式应用的场景 -----工作流,闸口,  投票--几次正常超过多少警告刷票。把几个不同的状态找出相同的方法  定一个抽象类。实现和重写抽象基类, ......
  • 设计模式——创建型设计模式
    创建型设计模式争对对象/类创建时的优化工厂方法模式(了解)通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建。情况:只适用于简单对象,......