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