成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【設(shè)計(jì)模式】責(zé)任鏈模式

cuieney / 1343人閱讀

摘要:流程展示類(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)。

流程展示

類(lèi)圖設(shè)計(jì)

為了實(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)處理。

編程實(shí)現(xiàn) LeaveRequest.java:
@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

相關(guān)文章

  • 利用責(zé)任模式設(shè)計(jì)一個(gè)攔截器

    摘要:前言近期在做的攔截器功能,正好用到了責(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); 前言 近期在做 ...

    dreamans 評(píng)論0 收藏0
  • JAVA設(shè)計(jì)模式責(zé)任模式

    摘要:責(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é)任鏈模式里,...

    libxd 評(píng)論0 收藏0
  • 我的Java設(shè)計(jì)模式-責(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)的。 小猿:........

    douzifly 評(píng)論0 收藏0
  • 慕課網(wǎng)_《模式的秘密之責(zé)任模式》學(xué)習(xí)總結(jié)

    時(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)用 案例:...

    jsyzchen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<