前言
责任链感觉用的也不少,尤其是当各种系统启动的时候,要初始化好多东西,并且这些启动都是有一定的顺序,谁在前,谁在后,谁是必须启动的,谁是暂时可以不启动的;还有就是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的处理流程一样;总之一句话,业务多种多样,但只要掌握处理问题的方式,就可以不变应万变