java 责任链模式

本文介绍了Java中使用责任链模式处理请求的原理和实例。通过创建一个抽象处理类定义处理方法,并由具体处理类如妈妈、爸爸和爷爷处理请求。请求按顺序逐级处理,直到被批准或返回失败信息。责任链模式在系统初始化和Web请求处理等场景中有广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

责任链感觉用的也不少,尤其是当各种系统启动的时候,要初始化好多东西,并且这些启动都是有一定的顺序,谁在前,谁在后,谁是必须启动的,谁是暂时可以不启动的;还有就是web请求过来的时候,需要一级级去处理,这些处理过程,都有一些内在的逻辑,而这些东西对外部请求都是不可感知的,只会在请求处理完毕之后(正常或着异常结束),会返回给外部或者调用端信息,告诉成功执行结果或者告诉异常信息

角色

1.要有一个抽象类,定义处理请求的方法和请求的处理过程

2.具体的handler实现类,用于对请求进行一级级处理

本文

1.场景为小明向家人要零花钱为例

2.先向妈妈要,若妈妈可以处理,则处理请求

3.若妈妈处理不了,则将请求传递给小明的爸爸去处理,若可以处理,则处理

4.若爸爸处理不了,则传递给爷爷,若可以处理,则处理,不可以处理的话,告诉原因

实例

抽象处理类,定义了处理方法,设置handler方法

public abstract class ChangeHandler {
    private ChangeHandler nextHandler;

    public ChangeHandler getNextHandler() {
        return nextHandler;
    }

    public void setNextHandler(ChangeHandler nextHandler) {
        this.nextHandler = nextHandler;
    }


    public abstract void handler(String hander, int change);
}

妈妈处理请求

public class MotherHandler extends ChangeHandler {

    @Override
    public void handler(String hander, int change) {
        if (hander.equals("mother") && change < 100) {
            System.out.println("老妈批准了");
        } else if (hander.equals("mother") && getNextHandler() != null) {
            System.out.println("老妈做不了主,他爸看吧");
            getNextHandler().handler("father", change);
        } else {
            System.out.println("申请不合适,重新写");
        }
    }

}

爸爸处理请求

public class FatherHandler extends ChangeHandler{

    @Override
    public void handler(String hander, int change) {
        if (hander.equals("father") && change < 1000) {
            System.out.println("老爸批准了");
        } else if (hander.equals("father") && getNextHandler() != null) {
            System.out.println("老爸做不了主,让我爹看看吧");
            getNextHandler().handler("grandpa", change);
        } else {
            System.out.println("申请不合适,重新写");
        }
    }
}

爷爷处理请求

public class GrandpaHandler extends ChangeHandler {

    @Override
    public void handler(String hander, int change) {
        if (hander.equals("grandpa") && change < 2000) {
            System.out.println("爷爷批准了");
        } else {
            System.out.println("孙子啊,你要这么多钱干啥去");
        }
   }
}

测试

public class ChainTest {

    public static void main(String[] args) {
      MotherHandler m=new MotherHandler();
      FatherHandler f=new FatherHandler();
      GrandpaHandler g=new GrandpaHandler();
      m.setNextHandler(f);
      f.setNextHandler(g);
      m.handler("mother", 9000);
    }
}

执行结果

老妈做不了主,他爸看吧
老爸做不了主,让我爹看看吧
孙子啊,你要这么多钱干啥去,爷爷办不到啊

总结:

处理过程中,可以选择让链条走完,也可以选择只要有一个节点处理请求,就退出,这些都是根据具体的业务逻辑来的;异常时,可以退出,也可以选择忽略继续往下走,这些也都是根据具体的业务逻辑来的,如果卡在一个逻辑中一定时间,也可以选择给当前处理人发送邮件或者打电话催促其处理,就向oa的处理流程一样;总之一句话,业务多种多样,但只要掌握处理问题的方式,就可以不变应万变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值