责任链模式核心思想:多个角色配合处理一个事件,每个角色都只负责自己的职责,链表示处理的事件是要有序的,什么阶段该做什么,由什么人做。
本次处理案例:一个请假的审批,3天以下人事和组长审批,3~7天:人事、组长和经理审批,x>=7:人事、组长、经理和CEO审批。
分析:多个角色:人事,组长,经理,CEO,事件:请假流程审批,有序:人事<组长<经理<CEO,那么如何判断什么时候是人 事处理还是其他角色处理,这里我们使用状态,比如最开始员工提交申请我们设置的状态为新建,那么这个状态下表示只能先人事处理。
先给这个事件创建一个链,让他是有序的并按我们的流程进行有效操作(这里我自己写的一个项目,暂时没有解决英汉互译问 题,看起来有点逼死强迫症的感觉,请见谅!)
public String getOperate(String state) {
if("新建".equals(state))
return "人事同意,人事拒绝";
else if("人事已同意".equals(state))
return "组长同意,组长拒绝";
else if("组长已同意".equals(state))
return "经理同意,经理拒绝";
else if("经理已同意".equals(state))
return "CEO同意,CEO拒绝";
else
return "";
}
我们接收从前台传过来请假单的状态和对请假单的操作进行对比判断是否有效
public void checkOperate(String state,String operate) {
if(getOperate(state).indexOf(operate)<0)
getShowException("当前状态有误!");
}
有序的事件写好了,什么状态下由什么人去做完成了,控制当前具体角色是否有操作权限(比如你组长登录了你不能有权限操作人事同意)自己进行权限控制吧。
我具体写的一个例子,人事同意和人事拒绝方法,参数:请假单号的json数组(对多个进行操作)reqNos,当前操作operate
public void personnelAgree(String reqNos,String operate) {
Long[] reqNoArray=getReqNoArray(reqNos);
for(Long reqNo:reqNoArray)
checkOperateUpdateState( reqNo, operate) ;
}
public void personnelRefuse(String reqNos,String operate) {
Long[] reqNoArray=getReqNoArray(reqNos);
for(Long reqNo:reqNoArray)
checkOperateUpdateState( reqNo, operate) ;
}
public Long[] getReqNoArray(String reqNos) {
JSONArray ja = JSONArray.fromObject(reqNos);
int length = ja.size();
Long[] reqNoArray = new Long[length];
for (int i = 0; i <