设计模式【15】--从审批流中学习责任链模式

设计模式

已经来到了责任链模式,各位客官听我瞎扯…

责任链模式是什么

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。(百度百科)

责任链模式是一种行为型设计模式,也就是重点是处理数据,假设我们有一份数据,需要经过很多个节点处理,那么就会是以下这个样子:

一个节点处理完之后,交给下一个节点,不知道大家有没有使用过审批流,当我们提完一个审批单后,你的leader审批,leader审批通过之后就是总监批,总监后面可能是高级总监,或者cto,或者hr。他们在同一个链条上,倘若你的leader没有审批完,后面的节点是不可能收到信息的。如果你的leader拒绝了你的申请,那数据也不会到达后面的审批节点。

如果你接触过前端,JS 中点击某个 div 的时候会产生冒泡事件,也就是点击下面的A, AB里面,BC里面, A-> B -> C 会依次收到点击事件:

再举个例子,在 SpringMVC中,我们有时候会定义一些拦截器,对请求进行预处理,也就是请求过来的时候,会依次经历拦截器,通过拦截器之后才会进入我们的处理业务逻辑代码。

之前,在做人员管理的时候,有涉及到人员离职情况的处理流程,要交接工作,解除权限,禁用账号等等,这整个处理流程就很适合使用责任链来处理。当然,自动处理流程是会出错的,保存每一个阶段的状态,针对出错的场景,可以手动去从断开责任链的地方接着执行。这整个流程的框架就是应用了责任链,但是根据实际场景也添加了不少其他的东西。

两点疑问

  1. 责任链的每一个节点是不是一定包含下一个节点的引用?

答:不一定,要么把所有责任节点放在一个list里面,依次处理;要么每个节点包含下一个责任节点的引用,

  1. 责任链到底是不允许中断还是不允许中断?

答:两种都可以,不拘泥于细节,可以根据自己的场景使用。

责任链模式中的角色

责任链一般有以下的角色:

  • Client(客户端):调用责任链处理器的处理方法,或者在第一个链对象中调用handle方法。
  • Handler(处理器):抽象类,提供给实际处理器继承然后实现handle方法,处理请求
  • ConcreteHandler(具体处理器):实现handler的类,同时实现handle方法,负责处理业务逻辑类,不同业务模块有不同的ConcreteHandler
  • HandlerChain:负责组合责任链的所有节点以及流程(如果节点包含下一个节点的引用,那么HandlerChain可以不存在)

审批链的实现

下面我们分别来实现不同的写法,假设现在有一个场景,秦怀入职了一家公司,哼哧哼哧干了一年,但是一直没调薪,又过了一年,总得加薪了吧,不加就要提桶跑路了,于是秦怀大胆去内部系统提了一个申请单:【加薪申请】

不中断模式

先演示不中断模式,得先弄个申请单的实体,里面包含了申请单的名字和申请人:

public class Requisition {
    // 名称
    public String name;


    // 申请人
    public String applicant;


    public Requisition(String name, String applicant) {
        this.name = name;
        this.applicant = applicant;
    }
}

责任链中的每个责任节点&#x

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
责任链模式是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理请求为止。这种模式将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,从而提高了系统的灵活性和可扩展性。 在审批流程中,责任链模式可以被用来处理不同级别的审批请求。每个审批者都有一个处理请求的方法,当收到请求时,它可以决定自己是否有能力处理该请求,如果有能力则处理,否则将请求传递给下一个审批者。这样,请求会依次经过多个审批者,直到找到能够处理请求的审批者为止。 以下是一个简单的Java代码示例,演示了如何使用责任链模式来设计审批流程: ```java // 定义抽象审批者类 abstract class Approver { protected Approver nextApprover; public void setNextApprover(Approver nextApprover) { this.nextApprover = nextApprover; } public abstract void processRequest(Request request); } // 具体审批者类 class Manager extends Approver { public void processRequest(Request request) { if (request.getAmount() <= 1000) { System.out.println("Manager approved the request."); } else if (nextApprover != null) { nextApprover.processRequest(request); } } } class Director extends Approver { public void processRequest(Request request) { if (request.getAmount() <= 5000) { System.out.println("Director approved the request."); } else if (nextApprover != null) { nextApprover.processRequest(request); } } } class CEO extends Approver { public void processRequest(Request request) { if (request.getAmount() <= 10000) { System.out.println("CEO approved the request."); } else { System.out.println("Request denied."); } } } // 定义请求类 class Request { private double amount; public Request(double amount) { this.amount = amount; } public double getAmount() { return amount; } } // 使用责任链模式处理审批流程 public class ApprovalProcess { public static void main(String[] args) { Approver manager = new Manager(); Approver director = new Director(); Approver ceo = new CEO(); manager.setNextApprover(director); director.setNextApprover(ceo); Request request1 = new Request(500); manager.processRequest(request1); Request request2 = new Request(5000); manager.processRequest(request2); Request request3 = new Request(15000); manager.processRequest(request3); } } ``` 在上述代码中,我们定义了三个具体的审批者类:Manager、Director和CEO。每个审批者都有一个处理请求的方法processRequest,如果自己有能力处理请求,则处理;否则将请求传递给下一个审批者。最后,我们使用责任链模式来处理三个不同金额的请求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值