职责链模式
职责链模式:程序员以多种不同的方式来解决问题,然后将他们链接在一起。当一个请求来临时,她遍历这个链,直到链中的某个解决方法能够处理该请求。
结合网上的这篇关于职责链的博客,我觉得非常好,案例是关于公司员工请假的流程 ,请求—>项目经理审批---->HR审批—>总经理审批。由于 原文是用C#来实现的,我按照原文的观点,使用java语言和enum实现了一下。请先移步至此,不然你可能不知道我在说什么… https://www.cnblogs.com/langtianya/p/4060941.html
/**
* @Author zhouzixiang
* @Date 2018年8月12日 下午2:04:38
* 请求类 :封装员工的请假理由 请假天数
*/
public class Request {
private float day;
private String resaon;
public Request(float day, String resaon) {
this.day = day;
this.resaon = resaon;
}
public float getDay() {
return day;
}
public void setDay(float day) {
this.day = day;
}
public String getResaon() {
return resaon;
}
public void setResaon(String resaon) {
this.resaon = resaon;
}
}
package 枚举.我的职责链;
import java.util.Random;
/**
* @author zhouzixinag
* @version 创建时间:2018年8月12日 下午2:06:18
* 类说明
* 枚举类 封装了 项目经理、人力资源HR、 总经理 三种角色。
*/
public enum Handler {
//项目经理
ProjectManager{
boolean PassRequest(Request request){
if (getSuccessor() ==null ) {
Successor = HR; //default 默认为HR;
}
System.out.println("项目经理开始审批...");
if (request.getDay()<=0.5) {
System.out.println("项目经理审批通过");
return true;
}
System.out.println("项目经理递交审批至"+Successor);
return Successor.PassRequest(request);
}
},
//HR
HR{
boolean PassRequest(Request request){
if (getSuccessor() == null) {
Successor = Manager; //default 默认为总经理;
}
System.out.println("人力资源HR开始审批...");
if (request.getDay()>0.5 && request.getDay()<=2) {
System.out.println("人力资源HR审批通过");
return true;
}
System.out.println("人力资源HR递交审批至"+Successor);
return Successor.PassRequest(request);
}
},
Manager{
boolean PassRequest(Request request){
Successor = null; //default 正常情况下没有下一处理者;
System.out.println("总经理开始审批...");
Random rand = new Random();
int nextInt = rand.nextInt(2);
if (nextInt==1) {
System.out.println("总经理审批通过");
return true;
}else {
System.out.println("总经理驳回了请假请求");
return false;
}
}
};
//下一个处理者
public Handler Successor ;
//获取下一个处理着
public Handler getSuccessor() {
return Successor;
}
//设置下一个处理着
public void setSuccessor(Handler successor) {
Successor = successor;
}
/*抽象方法,具体审批过程 有enum各自去实现*/
abstract boolean PassRequest(Request request);
public static void main(String[] args) {
Request request = new Request(0, "病假");
Request request2 = new Request(0.6f, "病假");//这里如果大于0.5天,会有异常,由于业务逻辑的关系,项目经理会和HR之间相互“踢皮球”。
//Handler handler = ProjectManager;//请求从头开始,也就是项目经理开始
Handler handler = HR;//请求也可以从中间开始 ,加入项目经理不在,直接从人力资源HR开始审核。
handler.setSuccessor(ProjectManager);
System.out.println(handler.PassRequest(request));
System.out.println(handler.PassRequest(request2));
}
}
运行结果: