最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之責(zé)任鏈模式詳解

 更新時(shí)間:2022年07月26日 15:32:42   作者:kaico2018  
客戶端發(fā)出一個(gè)請(qǐng)求,鏈上的對(duì)象都有機(jī)會(huì)來(lái)處理這一請(qǐng)求,而客戶端不需要知道誰(shuí)是具體的處理對(duì)象。這樣就實(shí)現(xiàn)了請(qǐng)求者和接受者之間的解耦,并且在客戶端可以實(shí)現(xiàn)動(dòng)態(tài)的組合職責(zé)鏈。使編程更有靈活性

責(zé)任鏈(Chain of Responsibility)模式的定義:為了避免請(qǐng)求發(fā)送者與多個(gè)請(qǐng)求處理者耦合在一起,于是將所有請(qǐng)求的處理者通過前一對(duì)象記住其下一個(gè)對(duì)象的引用而連成一條鏈;當(dāng)有請(qǐng)求發(fā)生時(shí),可將請(qǐng)求沿著這條鏈傳遞,直到有對(duì)象處理它為止。

責(zé)任鏈模式的結(jié)構(gòu)

抽象處理者(Handler) 角色:定義一個(gè)處理請(qǐng)求的接口,包含抽象處理方法和一個(gè)后繼連接。

具體處理者(Concrete Handler)角色:實(shí)現(xiàn)抽象處理者的處理方法,判斷能否處理本次請(qǐng)求,如果可以處理請(qǐng)求則處理,否則將該請(qǐng)求轉(zhuǎn)給它的后繼者。

客戶類(Client) 角色:創(chuàng)建處理鏈,并向鏈頭的具體處理者對(duì)象提交請(qǐng)求,它不關(guān)心處理細(xì)節(jié)和請(qǐng)求的傳遞過程。

應(yīng)用場(chǎng)景

  • 多條件流程判斷權(quán)限控制。
  • ERP系統(tǒng) 流程審批:總經(jīng)理、人事經(jīng)理、項(xiàng)目經(jīng)理。
  • Java過濾器的底層實(shí)現(xiàn)Filter
  • 多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,但具體由哪個(gè)對(duì)象處理該請(qǐng)求在運(yùn)行時(shí)自動(dòng)確定。
  • 可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求,或添加新的處理者。
  • 需要在不明確指定請(qǐng)求處理者的情況下,向多個(gè)處理者中的一個(gè)提交請(qǐng)求。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 降低了對(duì)象之間的耦合度。該模式使得一個(gè)對(duì)象無(wú)須知道到底是哪一個(gè)對(duì)象處理其請(qǐng)求以及鏈的結(jié)構(gòu),發(fā)送者和接收者也無(wú)須擁有對(duì)方的明確信息。
  • 增強(qiáng)了系統(tǒng)的可擴(kuò)展性??梢愿鶕?jù)需要增加新的請(qǐng)求處理類,滿足開閉原則。
  • 增強(qiáng)了給對(duì)象指派職責(zé)的靈活性。當(dāng)工作流程發(fā)生變化,可以動(dòng)態(tài)地改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,也可動(dòng)態(tài)地新增或者刪除責(zé)任。
  • 責(zé)任鏈簡(jiǎn)化了對(duì)象之間的連接。每個(gè)對(duì)象只需保持一個(gè)指向其后繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的if或者if.else語(yǔ)句。
  • 責(zé)任分擔(dān)。每個(gè)類只需要處理自己該處理的工作,不該處理的傳遞給下一個(gè)對(duì)象完成,明確各類的責(zé)任范圍,符合類的單一職責(zé)原則。

缺點(diǎn)

  • 不能保證每個(gè)請(qǐng)求一定被處理。 由于一個(gè)請(qǐng)求沒有明確的接收者,所以不能保證它-定會(huì)被處理,該請(qǐng)求可能一直傳到鏈的末端都得不到處理。
  • 對(duì)比較長(zhǎng)的職責(zé)鏈,請(qǐng)求的處理可能涉及多個(gè)處理對(duì)象,系統(tǒng)性能將受到一定影響。
  • 職責(zé)鏈建立的合理性要靠客戶端來(lái)保證,增加了客戶端的復(fù)雜性,可能會(huì)由于職責(zé)鏈的錯(cuò)誤設(shè)置而導(dǎo)致系統(tǒng)出錯(cuò),如可能會(huì)造成循環(huán)調(diào)用。

代碼案例

請(qǐng)假條對(duì)象

public class LeaveRequest {
    private String name;//姓名
    private int num;//請(qǐng)假天數(shù)
    private String content;//請(qǐng)假內(nèi)容
    public LeaveRequest(String name, int num, String content) {
        this.name = name;
        this.num = num;
        this.content = content;
    }
    public String getName() {
        return name;
    }
    public int getNum() {
        return num;
    }
    public String getContent() {
        return content;
    }
}

處理者抽象類

public abstract class Handler {
    protected final static int NUM_ONE = 1;
    protected final static int NUM_THREE = 3;
    protected final static int NUM_SEVEN = 7;
    //該領(lǐng)導(dǎo)處理的請(qǐng)假天數(shù)區(qū)間
    private int numStart;
    private int numEnd;
    //領(lǐng)導(dǎo)上面還有領(lǐng)導(dǎo)
    private Handler nextHandler;
    //設(shè)置請(qǐng)假天數(shù)范圍 上不封頂
    public Handler(int numStart) {
        this.numStart = numStart;
    }
    //設(shè)置請(qǐng)假天數(shù)范圍
    public Handler(int numStart, int numEnd) {
        this.numStart = numStart;
        this.numEnd = numEnd;
    }
    //設(shè)置上級(jí)領(lǐng)導(dǎo)
    public void setNextHandler(Handler nextHandler){
        this.nextHandler = nextHandler;
    }
    //提交請(qǐng)假條
    public final void submit(LeaveRequest leave){
        if(0 == this.numStart){
            return;
        }
        //如果請(qǐng)假天數(shù)達(dá)到該領(lǐng)導(dǎo)者的處理要求
        if(leave.getNum() >= this.numStart){
            this.handleLeave(leave);
            //如果還有上級(jí) 并且請(qǐng)假天數(shù)超過了當(dāng)前領(lǐng)導(dǎo)的處理范圍
            if(null != this.nextHandler && leave.getNum() > numEnd){
                this.nextHandler.submit(leave);//繼續(xù)提交
            } else {
                System.out.println("流程結(jié)束");
            }
        }
    }
    //各級(jí)領(lǐng)導(dǎo)處理請(qǐng)假條方法
    protected abstract void handleLeave(LeaveRequest leave);
}

繼承抽象類實(shí)現(xiàn)責(zé)任鏈中各個(gè)類中的處理方法

public class Counselor extends Handler {
    public Counselor() {
        //輔導(dǎo)員 處理1-3天的請(qǐng)假
        super(Handler.NUM_ONE, Handler.NUM_THREE);
    }
    @Override
    protected void handleLeave(LeaveRequest leave) {
        System.out.println(leave.getName() + "請(qǐng)假" + leave.getNum() + "天," + leave.getContent() + "。");
        System.out.println("輔導(dǎo)員審批:同意。");
        //也可以在這里設(shè)置下一個(gè)鏈路處理的handler
        //setNextHandler(new Dean());
    }
}
public class Dean extends Handler {
    public Dean() {
        //院長(zhǎng)處理3-7天的請(qǐng)假
        super(Handler.NUM_THREE, Handler.NUM_SEVEN);
    }
    @Override
    protected void handleLeave(LeaveRequest leave) {
        System.out.println(leave.getName() + "請(qǐng)假" + leave.getNum() + "天," + leave.getContent() + "。");
        System.out.println("院長(zhǎng)審批:同意。");
        //也可以在這里設(shè)置下一個(gè)鏈路處理的handler
        //setNextHandler(new CollegeSecretary ());
    }
}
public class CollegeSecretary extends Handler {
    public CollegeSecretary() {
        //學(xué)院書記處理7天以上的請(qǐng)假
        super(Handler.NUM_SEVEN);
    }
    @Override
    protected void handleLeave(LeaveRequest leave) {
        System.out.println(leave.getName() + "請(qǐng)假" + leave.getNum() + "天," + leave.getContent() + "。");
        System.out.println("學(xué)院書記審批:同意。");
        //也可以在這里設(shè)置下一個(gè)鏈路處理的handler
        //setNextHandler(null); //最后一個(gè)
    }
}

測(cè)試類

public class TestClient {
    public static void main(String[] args) {
        //請(qǐng)假條來(lái)一張
        LeaveRequest leave = new LeaveRequest("kaico",8,"身體不適");
        //各級(jí)領(lǐng)導(dǎo)
        Counselor counselor= new Counselor();
        //如果前面handleLeave 方法中設(shè)置了下一個(gè)handler,這里就不需要了,直接提交申請(qǐng)就好了
        Dean dean = new Dean();
        CollegeSecretary collegeSecretary = new CollegeSecretary();
        counselor.setNextHandler(dean);//輔導(dǎo)員的領(lǐng)導(dǎo)是院長(zhǎng)
        dean.setNextHandler(collegeSecretary);//院長(zhǎng)的領(lǐng)導(dǎo)是學(xué)院書記
        //提交申請(qǐng)
        counselor.submit(leave);
    }
}

到此這篇關(guān)于Java設(shè)計(jì)模式之責(zé)任鏈模式詳解的文章就介紹到這了,更多相關(guān)Java責(zé)任鏈模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker
    2009-06-06
  • SpringMVC+MyBatis分頁(yè)(最新)

    SpringMVC+MyBatis分頁(yè)(最新)

    本篇文章主要介紹了SpringMVC+MyBatis分頁(yè),具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • java類訪問權(quán)限與成員訪問權(quán)限解析

    java類訪問權(quán)限與成員訪問權(quán)限解析

    這篇文章主要針對(duì)java類訪問權(quán)限與成員訪問權(quán)限進(jìn)行解析,對(duì)類與成員訪問權(quán)限進(jìn)行驗(yàn)證,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 利用Java實(shí)現(xiàn)圖片馬賽克效果

    利用Java實(shí)現(xiàn)圖片馬賽克效果

    馬賽克效果是一種常見的圖像處理技術(shù),通過將圖像劃分為多個(gè)小塊并對(duì)每個(gè)小塊進(jìn)行平均色處理,模擬馬賽克的效果,在本項(xiàng)目中,我們將使用Java的Swing庫(kù)和圖像處理技術(shù)來(lái)實(shí)現(xiàn)圖片的馬賽克特效,需要的朋友可以參考下
    2025-02-02
  • SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    Apache?POI?是用Java編寫的免費(fèi)開源的跨平臺(tái)的?Java?API,Apache?POI提供API給Java程序?qū)icrosoft?Office格式檔案讀和寫的功能。本文主要介紹通過SpringBoot集成POI工具實(shí)現(xiàn)Excel的導(dǎo)入和導(dǎo)出功能,需要的可以參考一下
    2022-07-07
  • Java集合之HashMap用法詳解

    Java集合之HashMap用法詳解

    這篇文章主要介紹了Java集合之HashMap用法,結(jié)合實(shí)例形式分析了java map集合中HashMap定義、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • mybatis連接PGSQL中對(duì)于json和jsonb的處理方法

    mybatis連接PGSQL中對(duì)于json和jsonb的處理方法

    在使用PostgreSQL數(shù)據(jù)庫(kù)時(shí),將表字段設(shè)置為jsonb格式可以存儲(chǔ)JSON數(shù)據(jù),本文給大家介紹mybatis連接PGSQL中對(duì)于json和jsonb的處理方法,感興趣的朋友一起看看吧
    2024-11-11
  • SpringBoot實(shí)現(xiàn)WebSocket全雙工通信的項(xiàng)目實(shí)踐

    SpringBoot實(shí)現(xiàn)WebSocket全雙工通信的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot實(shí)現(xiàn)WebSocket全雙工通信的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java面試題——詳解HashMap和Hashtable 的區(qū)別

    java面試題——詳解HashMap和Hashtable 的區(qū)別

    本篇文章主要介紹了java中HashMap和Hashtable的區(qū)別,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • 詳解java中產(chǎn)生死鎖的原因及如何避免

    詳解java中產(chǎn)生死鎖的原因及如何避免

    這篇文章主要介紹了java中產(chǎn)生死鎖的原因及如何避免,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

体育| 钟祥市| 梅州市| 房产| 长岭县| 谷城县| 板桥市| 平凉市| 安平县| 南和县| 萝北县| 东海县| 忻州市| 英吉沙县| 故城县| 乐昌市| 衡阳县| 河池市| 鸡西市| 称多县| 达州市| 全州县| 临桂县| 盖州市| 北海市| 赞皇县| 郸城县| 大理市| 饶河县| 隆回县| 两当县| 象州县| 阳城县| 东阿县| 阳原县| 大安市| 衡东县| 沅江市| 伽师县| 丰台区| 松江区|