java-责任链模式
责任链模式介绍
责任链模式是一种行为型模式。责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求。
比如:员工请假3天以下,直属组长就能批。一个星期的假期,需要走到总监这一层批准。半个月的 假期则需要走到总经理这个级别了。请假的情况就非常适合使用责任链模式。事先不知道会由哪层领导批复假期,而各层领导的审批职责就好像铁链一样连接在一起,一个请求沿着这条链一直往上传。
//1.定义一个所有层级请假处理器都需要实现的接口 public interface AskForLeaveHander { void setNextHandler(AskForLeaveHander nextHandler); boolean handler(int days); }
public class HeadmanHander implements AskForLeaveHander { private AskForLeaveHander nextHandler; @Override public void setNextHandler(AskForLeaveHander nextHandler) { this.nextHandler = nextHandler; } @Override public boolean handler(int days) { if (days <= 3){ System.out.println("组长成功批复了!"); return true; } System.out.println(String.format("%d 天假期超出组长权限,请总监批复",days)); return nextHandler.handler(days); } }
public class ChiefHander implements AskForLeaveHander { private AskForLeaveHander nextHandler; @Override public void setNextHandler(AskForLeaveHander nextHandler) { this.nextHandler = nextHandler; } @Override public boolean handler(int days) { if (days <= 7){ System.out.println("总监成功批复了!"); return true; } System.out.println(String.format("%d 天假期超出总监权限,请总经理批复", days)); return nextHandler.handler(days); } }
public class GmHander implements AskForLeaveHander { private AskForLeaveHander nextHandler; @Override public void setNextHandler(AskForLeaveHander nextHandler) { this.nextHandler = nextHandler; } @Override public boolean handler(int days) { if (days <= 60){ System.out.println("总经理成功批复了!"); return true; } System.out.println("单次最多只能请60天假!"); return false; } }
@GetMapping("/askOff") public BasicResult<String> askOff(@RequestParam Integer days) { HeadmanHander headmanHander = new HeadmanHander(); ChiefHander chiefHander = new ChiefHander(); GmHander gmHander = new GmHander(); headmanHander.setNextHandler(chiefHander); chiefHander.setNextHandler(gmHander); if (headmanHander.handler(days)){ return BasicResult.success("您申请的假期已被批准"); }else{ return BasicResult.fail("最近项目太忙了,暂不批假"); } }
启动项目:http://localhost:10001/user/askOff?days=18