需求背景:
请你设计一个员工休假审批流程,当员工的休假天数<=1时,由直接领导审批,休假天数<=2时,分别由直接领导、一级部门领导审批,休假天数>=3时,分别由直接领导、一级部门领导、分管领导审批。
不使用责任链:
package com.shejimoshi;
public class Main {
public static void main(String[] args) {
RequestParam requestParam = new RequestParam("MJ", 3);
if (requestParam.getTime()>=1){
System.out.println("领导审批");
if (requestParam.getTime()>=2){
System.out.println("一级部门领导审批");
if (requestParam.getTime()>=3){
System.out.println("分管领导审批");
}
}
}
}
}
使用责任链各司其职:
抽象审批类AuditHandler,包含下一个处理者的引用nextAuditHandler,通过setNextAuditHandler方法进行注入,从而形成一条链,抽象audit方法,由各个处理者的实现类去实现各自的审批逻辑。
package com.shejimoshi;
public abstract class AuditHandler {
protected AuditHandler nextAuditHandler;
public void setNextAuditHandler(AuditHandler nextAuditHandler) {
this.nextAuditHandler = nextAuditHandler;
}
public abstract void audit(RequestParam requestParam);
}
class DirectLeaderAuditHandler extends AuditHandler{
@Override
public void audit(RequestParam requestParam) {
if (requestParam.getTime()>=1){
System.out.println("班主任审批通过");
}
if (nextAuditHandler != null){
nextAuditHandler.audit(requestParam);
}else {
System.out.println("审批完成");
}
}
}
class FirstLeaderAuditHandler extends AuditHandler{
@Override
public void audit(RequestParam requestParam) {
if (requestParam.getTime()>=2){
System.out.println("学院审批通过");
}
if (nextAuditHandler != null){
nextAuditHandler.audit(requestParam);
}else {
System.out.println("审批完成");
}
}
}
class FenGuanLeaderAuditHandler extends AuditHandler{
@Override
public void audit(RequestParam requestParam) {
if (requestParam.getTime()>=3){
System.out.println("学校审批通过");
}
if (nextAuditHandler != null){
nextAuditHandler.audit(requestParam);
}else {
System.out.println("审批完成");
}
}
}
class Test{
public static void main(String[] args) {
AuditHandler handler = new DirectLeaderAuditHandler();
FirstLeaderAuditHandler firstLeaderAuditHandler = new FirstLeaderAuditHandler();
FenGuanLeaderAuditHandler fenGuanLeaderAuditHandler = new FenGuanLeaderAuditHandler();
handler.setNextAuditHandler(firstLeaderAuditHandler);
firstLeaderAuditHandler.setNextAuditHandler(fenGuanLeaderAuditHandler);
RequestParam requestParam = new RequestParam("MJ", 2);
handler.audit(requestParam);
}
}
摘取: