摘要:流程展示類圖設計為了實現上述場景,我們可以采用責任鏈設計模式。天,運行輸出審批拒絕總結責任鏈主要重在責任分離處理,讓各個節點各司其職。責任鏈比較長,調試時可能會比較麻煩。
責任鏈模式 概念描述
責任鏈,顧名思義,就是用來處理相關事務責任的一條執行鏈,執行鏈上有多個節點,每個節點都有機會(條件匹配)處理請求事務,如果某個節點處理完了就可以根據實際業務需求傳遞給下一個節點繼續處理或者返回處理完畢。
適用場景現實中,請假的OA申請,請假天數如果是半天到1天,可能直接主管批準即可;
如果是1到3天的假期,需要部門經理批準;
如果是3天到30天,則需要總經理審批;
大于30天,正常不會批準。
為了實現上述場景,我們可以采用責任鏈設計模式。
員工提交請求類:LeaveRequest。
抽象的請假責任處理類:AbstractLeaveHandler。
直接主管審批處理類:DirectLeaderLeaveHandler。
部門經理處理類:DeptManagerLeaveHandler。
總經理處理類: GManagerLeaveHandler。
員工請求發起申請到抽象的責任處理類中,根據員工的請假天數,對應的處理類完成處理。
每一個責任處理類設置下面的節點。自身處理不了則傳遞給下一個節點處理。
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder public class LeaveRequest { /**天數*/ private int leaveDays; /**姓名*/ private String name; }AbstractLeaveHandler.java;
/** * @program: cookbook * @description: 請假責任鏈抽象處理類 * @author: Byron * @create: 2019/07/11 09:34 */ public abstract class AbstractLeaveHandler { /**直接主管審批處理的請假天數*/ protected int MIN = 1; /**部門經理處理的請假天數*/ protected int MIDDLE = 3; /**總經理處理的請假天數*/ protected int MAX = 30; /**領導名稱*/ protected String handlerName; /**下一個處理節點(即更高級別的領導)*/ protected AbstractLeaveHandler nextHandler; /**設置下一節點*/ protected void setNextHandler(AbstractLeaveHandler handler){ this.nextHandler = handler; } /**處理請假的請求,子類實現*/ protected void handlerRequest(LeaveRequest request){ } }DirectLeaderLeaveHandler.java:
/** * @program: cookbook * @description: 直接主管處理類 * @author: Byron * @create: 2019/07/11 09:46 */ public class DirectLeaderLeaveHandler extends AbstractLeaveHandler{ public DirectLeaderLeaveHandler(String name) { this.handlerName = name; } @Override protected void handlerRequest(LeaveRequest request) { if(request.getLeaveDays() <= this.MIN){ System.out.println("直接主管:" + handlerName + ",已經處理;流程結束。"); return; } if(null != this.nextHandler){ this.nextHandler.handlerRequest(request); }else{ System.out.println("審批拒絕!"); } } }DeptManagerLeaveHandler.java:
/** * @program: cookbook * @description: 部門經理處理類 * @author: Byron * @create: 2019/07/11 09:48 */ public class DeptManagerLeaveHandler extends AbstractLeaveHandler { public DeptManagerLeaveHandler(String name) { this.handlerName = name; } @Override protected void handlerRequest(LeaveRequest request) { if(request.getLeaveDays() <= this.MIDDLE){ System.out.println("部門經理:" + handlerName + ",已經處理;流程結束。"); return; } if(null != this.nextHandler){ this.nextHandler.handlerRequest(request); }else{ System.out.println("審批拒絕!"); } } }GManagerLeaveHandler.java:
/** * @program: cookbook * @description: 總經理處理類 * @author: Byron * @create: 2019/07/11 09:49 */ public class GManagerLeaveHandler extends AbstractLeaveHandler { public GManagerLeaveHandler(String name) { this.handlerName = name; } @Override protected void handlerRequest(LeaveRequest request) { if(request.getLeaveDays() <= this.MAX){ System.out.println("總經理:" + handlerName + ",已經處理;流程結束。"); return; } if(null != this.nextHandler){ this.nextHandler.handlerRequest(request); }else{ System.out.println("審批拒絕!"); } } }演示 ResponsibilityTest.java:
public class ResponsibilityTest { public static void main(String[] args) { LeaveRequest request = LeaveRequest.builder().leaveDays(20).name("小明").build(); AbstractLeaveHandler directLeaderLeaveHandler = new DirectLeaderLeaveHandler("縣令"); DeptManagerLeaveHandler deptManagerLeaveHandler = new DeptManagerLeaveHandler("知府"); GManagerLeaveHandler gManagerLeaveHandler = new GManagerLeaveHandler("京兆尹"); directLeaderLeaveHandler.setNextHandler(deptManagerLeaveHandler); deptManagerLeaveHandler.setNextHandler(gManagerLeaveHandler); directLeaderLeaveHandler.handlerRequest(request); } }
20天,運行輸出: 總經理:京兆尹,已經處理;流程結束。
1天,運行輸出: 直接主管:縣令,已經處理;流程結束。
3天,運行輸出: 部門經理:知府,已經處理;流程結束。
35天,運行輸出: 審批拒絕!
總結責任鏈主要重在責任分離處理,讓各個節點各司其職。
責任鏈上的各個節點都有機會處理事務,但是也可能不會受理請求。
責任鏈比較長,調試時可能會比較麻煩。
責任鏈一般用于處理流程節點之類的實際業務場景中。
Spring攔截器鏈、servlet過濾器鏈等都采用了責任鏈設計模式。
鏈接CookBook
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75373.html
摘要:前言近期在做的攔截器功能,正好用到了責任鏈模式。通過官方圖就可以非常清楚的看出是一個責任鏈模式用責任鏈模式設計一個攔截器對于攔截器來說使用責任鏈模式再好不過了。設置攔截器到責任鏈中時通過反射將的值保存到各個攔截器中。 showImg(https://segmentfault.com/img/remote/1460000016756077?w=1733&h=1300); 前言 近期在做 ...
摘要:責任鏈模式涉及到的角色如下所示抽象處理者角色定義一個處理請求的抽象類。如果一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱為不純的責任鏈模式。一般來說,日常開發中不純的責任鏈模式用的比較多一點。參考責任鏈模式更多文章 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責任鏈(Chain of Responsibility)模式的: 責任鏈模式是一種對象的行為模式。在責任鏈模式里,...
摘要:咦這一層一層上報就涉及到這次的責任鏈模式。責任鏈模式和觀察者模式存在一個共同點,就是傳遞責任鏈模式是一級一級的傳遞,形成一條鏈,鏈節點處理者之間是存在傳遞關系的。這是責任鏈模式和觀察者模式的區別,也是責任鏈模式的核心。 今天來說說程序員小猿和產品就關于需求發生的故事。前不久,小猿收到了產品的需求。 產品經理:小猿,為了迎合大眾屌絲用戶的口味,我們要放一張圖,要露點的。 小猿:........
時間:2017年08月30日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:責任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責任鏈模式 如何實現責任鏈模式 責任鏈模式如何解耦 責任鏈模式的應用 案例:...
閱讀 2809·2021-10-08 10:04
閱讀 3198·2021-09-10 11:20
閱讀 523·2019-08-30 10:54
閱讀 3306·2019-08-29 17:25
閱讀 2302·2019-08-29 16:24
閱讀 885·2019-08-29 12:26
閱讀 1447·2019-08-23 18:35
閱讀 1930·2019-08-23 17:53