责任链模式简单实现

责任链是由很多责任节点串联起来的一条任务链条,其中每一个责任节点都是一个业务处理环节。责任链模式(Chain of Responsibility)允许业务请求者将责任链视为一个整体并对其发起请求,而不必关心链条内部具体的业务逻辑与流程走向,也就是说,请求者不必关心具体是哪个节点起了作用,总之业务最终能得到相应的处理。在软件系统中,当一个业务需要经历一系列业务对象去处理时,我们可以把这些业务对象串联起来成为一条业务责任链,请求者可以直接通过访问业务责任链来完成业务的处理,最终实现请求者与响应者的解耦。

业务场景

当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式

责任链模式实际上是一种处理请求的模式,它让多个处理器(对象节点)都有机会处理该请求,直到其中某个处理成功为止。责任链模式把多个处理器串成链,然后让请求在链上传递

责任链模式使用

  • 一个接口或者抽象类
  • 每个对象差异化处理
  • 对象链初始化(连起来)

我们来看一个带有一些逻辑的责任链:报销审批流程。公司为了更高效、安全规范地把控审核工作,通常会将整个审批工作过程按负责人或者工作职责进行拆分,并组织好各个环节中的逻辑关系及走向,最终形成标准化的审批流程,如图所示。

我们可以发现审批人的业务之间有环环相扣的关联,对于超出审批人职权范围的申请会传递给上级,直到解决问题为止。这种传递机制就需要我们搭建一个链式结构的工作流,这也是责任链模式的精髓之所在

我们来做一个简单的实例。假设某公司的报销审批流程有3个审批角色,分别是财务专员(1 000元审批权限)、财务经理(5 000元审批权限)以及财务总监(10 000元审批权限)

一个接口或者抽象类

这个接口或者抽象类,需要:

  • 有一个指向责任下一个对象的属性
  • 一个设置下一个对象的set方法
  • 给子类对象差异化实现的方法(如以下代码的approve方法)
package com.cyc.mystudy.zerenlian;

/**
 * @Author cyc
 * @create 2022/8/5 16:10
 */
public abstract class Approver {

    protected String name;//审批人姓名
    protected Approver nextApprover;//指向下一位审批人

    public Approver(String name) {
        this.name = name;
    }

    protected Approver setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
        return nextApprover;
    }

    public abstract void approve(int amount);
}

 每个对象差异化处理

财务专员

package com.cyc.mystudy.zerenlian;

/**
 * @Author cyc
 * @create 2022/8/5 16:15
 */
public class Staff extends Approver{


    public Staff(String name) {
        super(name);
    }

    @Override
    public void approve(int amount) {
       if (amount>1000){
            this.nextApprover.approve(amount);
       }else {
           System.out.println(name+"---"+amount+"--通过");
       }
    }
}

财务经理

package com.cyc.mystudy.zerenlian;

/**
 * @Author cyc
 * @create 2022/8/5 16:20
 */
public class Manager extends Approver{

    public Manager(String name) {
        super(name);
    }

    @Override
    public void approve(int amount) {
        if (amount>5000){
            this.nextApprover.approve(amount);
        }else {
            System.out.println(name+"---"+amount+"--通过");
        }
    }



}

财务总监

package com.cyc.mystudy.zerenlian;

/**
 * @Author cyc
 * @create 2022/8/5 16:21
 */
public class CFO extends Approver{

    public CFO(String name) {
        super(name);
    }

    @Override
    public void approve(int amount) {
        if (amount>10000){
            System.out.println(name+"---"+amount+"--失败");
        }else {
            System.out.println(name+"---"+amount+"--通过");
        }
    }
}

对象链连起来(初始化)&& 使用

Clinet

package com.cyc.mystudy.zerenlian;

/**
 * @Author cyc
 * @create 2022/8/5 16:25
 */
public class Client {
    public static void main(String[] args) {
        Staff staff = new Staff("财务专员");
        staff.setNextApprover(new Manager("财务经理")).setNextApprover(new CFO("财务总监"));

        staff.approve(500);
        staff.approve(4000);
        staff.approve(6000);
        staff.approve(16000);
    }
}

运行截图:

一开始我们构造了财务专员,接着组装了责任链,由低到高逐级进行审批角色对象的注入,直至财务总监。申请人的业务办理流程就非常简单了,客户端直接面对的就是财务专员,只需将申请递交给他处理,接着审批流程奇迹般地启动了,业务在这个责任链上层层递交,直至完成。各种不同金额的审批场景对应的办理流程,从输出看出达到了工作流的预期运行结果。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
责任链模式可以用于实现登录验证,它可以将验证逻辑拆分成多个独立的步骤,并将这些步骤组织成一个,每个步骤都可以决定是否继续往下执行,或者直接返回验证失败。 在实现登录验证时,可以按照以下步骤构建责任: 1. 创建一个抽象处理器类,定义一个处理请求的抽象方法,以及一个设置下一个处理器的方法。 2. 创建多个具体处理器类,实现抽象处理器类的抽象方法,并在其中实现不同的验证逻辑。 3. 将这些具体处理器按照顺序组织成一个,将它们的下一个处理器设置为中的下一个处理器。 4. 在客户端代码中,创建一个的入口处理器,并将请求发送给它进行处理。 下面是一个简单的示例代码: ```java // 抽象处理器 abstract class LoginHandler { protected LoginHandler nextHandler; public void setNextHandler(LoginHandler nextHandler) { this.nextHandler = nextHandler; } public abstract boolean handle(LoginRequest request); } // 具体处理器 class UsernameHandler extends LoginHandler { public boolean handle(LoginRequest request) { if (request.getUsername() == null || request.getUsername().isEmpty()) { return false; } if (nextHandler != null) { return nextHandler.handle(request); } return true; } } class PasswordHandler extends LoginHandler { public boolean handle(LoginRequest request) { if (request.getPassword() == null || request.getPassword().isEmpty()) { return false; } if (nextHandler != null) { return nextHandler.handle(request); } return true; } } class CaptchaHandler extends LoginHandler { public boolean handle(LoginRequest request) { if (request.getCaptcha() == null || request.getCaptcha().isEmpty()) { return false; } if (nextHandler != null) { return nextHandler.handle(request); } return true; } } // 客户端代码 public class LoginValidator { private LoginHandler handler; public LoginValidator() { // 构建责任 handler = new UsernameHandler(); handler.setNextHandler(new PasswordHandler()); handler.getNextHandler().setNextHandler(new CaptchaHandler()); } public boolean validate(LoginRequest request) { return handler.handle(request); } } // 登录请求 class LoginRequest { private String username; private String password; private String captcha; // 省略构造函数和getter/setter方法 } ``` 在这个示例代码中,抽象处理器 LoginHandler 定义了处理请求的抽象方法 handle(),并提供了设置下一个处理器的方法 setNextHandler()。具体处理器 UsernameHandler、PasswordHandler 和 CaptchaHandler 都继承了 LoginHandler 并实现了 handle() 方法,在其中实现了不同的验证逻辑,并在需要时调用下一个处理器的 handle() 方法。在客户端代码中,创建一个 LoginValidator 类,它构建了一个责任,并提供了一个 validate() 方法,将登录请求传递给的入口处理器进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值