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