日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

一文搞懂設(shè)計模式—責(zé)任鏈模式

來源: 責(zé)編: 時間:2024-02-01 12:51:22 274觀看
導(dǎo)讀責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計模式,它允許多個對象按照順序處理請求,并且每個對象可以選擇自己是否處理該請求或?qū)⑵鋫鬟f給下一個對象。這種模式將請求的發(fā)送者和接收者解耦,同時提供了更

責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計模式,它允許多個對象按照順序處理請求,并且每個對象可以選擇自己是否處理該請求或?qū)⑵鋫鬟f給下一個對象。這種模式將請求的發(fā)送者和接收者解耦,同時提供了更大的靈活性和可擴(kuò)展性。1CG28資訊網(wǎng)——每日最新資訊28at.com

簡介

責(zé)任鏈模式通過將多個處理請求的對象組成一條鏈,使請求在鏈上傳遞,直到有一個對象處理它為止。每個處理對象都負(fù)責(zé)判斷自己能否處理該請求,如果可以則進(jìn)行處理,否則將請求傳遞給下一個處理對象。這樣,請求發(fā)送者無需知道具體的處理對象,只需將請求發(fā)送到責(zé)任鏈上即可。1CG28資訊網(wǎng)——每日最新資訊28at.com

責(zé)任鏈模式包含以下角色:1CG28資訊網(wǎng)——每日最新資訊28at.com

  • 抽象處理者(Handler):定義一個處理請求的接口,并持有下一個處理者的引用。
  • 具體處理者(Concrete Handler):實現(xiàn)抽象處理者的接口,在處理請求前判斷自己是否能夠處理該請求,如果可以則進(jìn)行處理,否則將請求傳遞給下一個處理者。

通過責(zé)任鏈模式,我們可以動態(tài)地組合處理對象,靈活地配置處理流程,這種解耦使得系統(tǒng)更加靈活和可擴(kuò)展。1CG28資訊網(wǎng)——每日最新資訊28at.com

使用場景

責(zé)任鏈模式常用于以下場景:1CG28資訊網(wǎng)——每日最新資訊28at.com

  • 動態(tài)組合處理流程:通過靈活配置責(zé)任鏈,可以動態(tài)地組合處理對象,實現(xiàn)不同的處理流程。每個處理者只需關(guān)注自己負(fù)責(zé)處理的請求,使得系統(tǒng)更加靈活和可擴(kuò)展。
  • 避免請求的發(fā)送者和接收者之間的直接耦合:通過將請求傳遞給責(zé)任鏈,請求發(fā)送者無需知道具體的處理對象,減少了對象之間的依賴關(guān)系。
  • 處理請求的順序可變:責(zé)任鏈模式允許在運行時根據(jù)需要改變處理請求的順序,靈活調(diào)整處理流程。

常見的實際應(yīng)用場景包括:1CG28資訊網(wǎng)——每日最新資訊28at.com

  • 日志記錄器鏈:一個日志記錄系統(tǒng)可以根據(jù)日志級別將日志消息傳遞給不同的日志記錄器,如控制臺記錄器、文件記錄器、數(shù)據(jù)庫記錄器等。
  • 審批流程:一個多級審批系統(tǒng)可以根據(jù)審批者的權(quán)限和級別將審批請求傳遞給下一個級別的審批者,直到獲得最終的審批結(jié)果。
  • 異常處理:一個異常處理系統(tǒng)可以根據(jù)異常類型將異常進(jìn)行分類處理,如日志記錄、郵件通知、異常展示等。

責(zé)任鏈模式在這些場景中可以減少代碼的耦合性,提高代碼的可維護(hù)性和可擴(kuò)展性。1CG28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)缺點

優(yōu)點:1CG28資訊網(wǎng)——每日最新資訊28at.com

  • 解耦發(fā)送者和接收者:責(zé)任鏈模式將請求的發(fā)送者和接收者解耦,發(fā)送者無需知道具體的處理對象,只需將請求發(fā)送到責(zé)任鏈上即可。
  • 靈活動態(tài)的處理流程:通過配置責(zé)任鏈,可以靈活地組合處理對象,實現(xiàn)不同的處理流程,并且可以在運行時動態(tài)地改變處理的順序。
  • 增強代碼的可擴(kuò)展性:由于責(zé)任鏈模式遵循開閉原則,新的處理者可以隨時被加入到責(zé)任鏈中,不需要修改已有代碼,提供了良好的擴(kuò)展性。
  • 增強代碼的可維護(hù)性:每個處理者只需關(guān)注自己負(fù)責(zé)處理的請求,職責(zé)單一,使得代碼更加清晰、可讀性更高。

缺點:1CG28資訊網(wǎng)——每日最新資訊28at.com

  • 請求的處理不保證被處理:由于責(zé)任鏈中的每個處理者都可以選擇是否處理請求,如果沒有正確配置責(zé)任鏈或者某個處理者沒有正確處理請求,可能會導(dǎo)致請求無法被處理。
  • 性能問題:當(dāng)責(zé)任鏈過長或者請求在責(zé)任鏈中被頻繁傳遞時,可能會對性能產(chǎn)生影響。因此,在設(shè)計責(zé)任鏈時需要注意鏈的長度和處理的復(fù)雜度。
  • 調(diào)試不方便:當(dāng)責(zé)任鏈特別是鏈條比較長, 環(huán)節(jié)比較多的時候,由于采用了類似遞歸的方式,調(diào)試的時候邏輯可能比較復(fù)雜。

在實際應(yīng)用中,我們需要根據(jù)具體情況評估責(zé)任鏈模式的優(yōu)缺點,并合理地選擇使用或者改進(jìn)這個模式。1CG28資訊網(wǎng)——每日最新資訊28at.com

責(zé)任鏈模式實現(xiàn)

要實現(xiàn)責(zé)任鏈模式,我們按照以下步驟進(jìn)行:1CG28資訊網(wǎng)——每日最新資訊28at.com

  1. 定義處理者接口(Handler),聲明處理方法,并添加設(shè)置下一個處理者的方法。
  2. 實現(xiàn)具體處理者類(ConcreteHandler),實現(xiàn)處理方法,并在需要時選擇是否調(diào)用下一個處理者。
  3. 在客戶端代碼中創(chuàng)建責(zé)任鏈,并將請求發(fā)送到責(zé)任鏈上的第一個處理者。

以下是一個簡單的示例,演示如何使用責(zé)任鏈模式處理請假申請:1CG28資訊網(wǎng)——每日最新資訊28at.com

步驟一:定義處理者接口(Handler)1CG28資訊網(wǎng)——每日最新資訊28at.com

/** * <p> * 責(zé)任鏈模式——抽象類處理器 * </p> */public abstract class AbstractHandler {    /**     * 責(zé)任鏈中的下一個元素     */    protected AbstractHandler nextHandler;    public AbstractHandler setNextChain(AbstractHandler nextHandler) {        this.nextHandler = nextHandler;        return nextHandler;    }    /**     * 責(zé)任鏈處理邏輯     */    public void linkChain(LeaveRequest request) {        handler(request);        //這里還可以加入其他方法        if (Objects.nonNull(nextHandler)) {            nextHandler.linkChain(request);        }    }    /**     * 抽象方法     */    protected abstract void handler(LeaveRequest request);}

請求對象為:1CG28資訊網(wǎng)——每日最新資訊28at.com

@Getterpublic class LeaveRequest {    private final String employee;    private final int days;    public LeaveRequest(String employee, int days) {        this.employee = employee;        this.days = days;    }}

步驟二:實現(xiàn)具體處理者類(ConcreteHandler)1CG28資訊網(wǎng)——每日最新資訊28at.com

@Slf4jpublic class Handler1 extends AbstractHandler {    @Override    public void handler(LeaveRequest request) {        if (request.getDays() <= 3) {            log.info("ConcreteHandlerA 處理了 " + request.getEmployee() + " 的請假申請,天數(shù)為:" + request.getDays());        }    }}@Slf4jpublic class Handler2 extends AbstractHandler {    @Override    public void handler(LeaveRequest request) {        if (request.getDays() > 3 && request.getDays() <= 7) {            log.info("ConcreteHandlerB 處理了 " + request.getEmployee() + " 的請假申請,天數(shù)為:" + request.getDays());        }    }}@Slf4jpublic class Handler3 extends AbstractHandler {    @Override    protected void handler(LeaveRequest request) {        if (request.getDays() > 7) {            log.info("ConcreteHandlerC 處理了 " + request.getEmployee() + " 的請假申請,天數(shù)為:" + request.getDays());        }    }}

步驟三:在客戶端代碼中創(chuàng)建責(zé)任鏈,并將請求發(fā)送到責(zé)任鏈上的第一個處理者1CG28資訊網(wǎng)——每日最新資訊28at.com

public class ChainPatternDemo {    private static AbstractHandler getChainOfHandler() {        AbstractHandler handler1 = new Handler1();        AbstractHandler handler2 = new Handler2();        AbstractHandler handler3 = new Handler3();        //可以自定義鏈路順序        handler1.setNextChain(handler2).setNextChain(handler3);        return handler1;    }    public static void main(String[] args) {        AbstractHandler chain = getChainOfHandler();        LeaveRequest request1 = new LeaveRequest("張三", 2);        chain.linkChain(request1);        LeaveRequest request2 = new LeaveRequest("李四", 5);        chain.linkChain(request2);        LeaveRequest request3 = new LeaveRequest("王五", 10);        chain.linkChain(request3);    }}

在上述示例中,我們定義了三個具體處理者類:Handler1、Handler2和Handler3,它們分別處理請假申請。客戶端代碼創(chuàng)建了責(zé)任鏈,并將請求發(fā)送給第一個處理者Handler1。每個具體處理者判斷自己是否能夠處理該請求,如果可以則進(jìn)行處理,否則傳遞給下一個處理者。1CG28資訊網(wǎng)——每日最新資訊28at.com

運行以上代碼,輸出結(jié)果為:1CG28資訊網(wǎng)——每日最新資訊28at.com

ConcreteHandlerA 處理了 張三 的請假申請,天數(shù)為:2ConcreteHandlerB 處理了 李四 的請假申請,天數(shù)為:5ConcreteHandlerC 處理了 王五 的請假申請,天數(shù)為:10

這只是一個簡單示例,實際使用時可以根據(jù)業(yè)務(wù)需求進(jìn)行適當(dāng)?shù)臄U(kuò)展和修改。1CG28資訊網(wǎng)——每日最新資訊28at.com

在使用責(zé)任鏈模式時,需要注意以下幾點:1CG28資訊網(wǎng)——每日最新資訊28at.com

  • 確定責(zé)任鏈中的處理順序:要確保責(zé)任鏈中處理者的順序是正確的,以便能夠按照預(yù)期處理請求。處理者的順序可以在創(chuàng)建責(zé)任鏈時進(jìn)行設(shè)置。
  • 避免出現(xiàn)循環(huán)引用:如果責(zé)任鏈中的處理者之間出現(xiàn)了循環(huán)引用,可能會導(dǎo)致請求無法被正確處理或進(jìn)入死循環(huán)。因此,在設(shè)置下一個處理者時要注意避免出現(xiàn)循環(huán)引用的情況。
  • 處理者的數(shù)量控制:在設(shè)計責(zé)任鏈時要注意控制處理者的數(shù)量,避免責(zé)任鏈過長導(dǎo)致性能下降。可以根據(jù)實際需求合理劃分責(zé)任鏈,將相關(guān)的處理邏輯放在同一個處理者中,可以在 Handler 中設(shè)置一個最大節(jié)點數(shù)量,在 setNextChain() 方法中判斷是否已經(jīng)是超過其閾值,超過則不允許該鏈建立,避免無意識地破壞系統(tǒng)性能。

通過建造者模式優(yōu)化

我們可以通過建造者模式來創(chuàng)建責(zé)任鏈中的處理者對象。這種優(yōu)化可以使責(zé)任鏈的創(chuàng)建和配置更加靈活和可拓展,符合開閉原則。1CG28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)化后的示例代碼:1CG28資訊網(wǎng)——每日最新資訊28at.com

/** * <p> * 責(zé)任鏈模式——抽象類處理器 * </p> */public abstract class AbstractHandler {    /**     * 責(zé)任鏈中的下一個元素     */    protected AbstractHandler nextHandler;    private void setNextChain(AbstractHandler nextHandler) {        this.nextHandler = nextHandler;    }    /**     * 責(zé)任鏈處理邏輯     */    public void linkChain(LeaveRequest request) {        handler(request);        //這里還可以加入其他方法        if (Objects.nonNull(nextHandler)) {            nextHandler.linkChain(request);        }    }    /**     * 抽象方法     */    protected abstract void handler(LeaveRequest request);    public static class Builder {        private AbstractHandler head;        private AbstractHandler tail;        public Builder addHandler(AbstractHandler handler) {            if (this.head == null) {                this.head = this.tail = handler;                return this;            }            this.tail.setNextChain(handler);            this.tail = handler;            return this;        }        public AbstractHandler build() {            return this.head;        }    }}
public class ChainPatternDemo {    private static AbstractHandler getChainOfHandler() {        return new AbstractHandler.Builder()                .addHandler(new Handler1())                .addHandler(new Handler2())                .addHandler(new Handler3())                .build();    }    public static void main(String[] args) {        AbstractHandler chain = getChainOfHandler();        LeaveRequest request1 = new LeaveRequest("張三", 2);        chain.linkChain(request1);        LeaveRequest request2 = new LeaveRequest("李四", 5);        chain.linkChain(request2);        LeaveRequest request3 = new LeaveRequest("王五", 10);        chain.linkChain(request3);    }}

在客戶端代碼中,我們使用建造者模式創(chuàng)建了一個包含多個處理者的責(zé)任鏈,并發(fā)送了一個請假申請。責(zé)任鏈會按照添加處理者的順序依次處理請假申請,直到找到能夠處理該請求的處理者為止。1CG28資訊網(wǎng)——每日最新資訊28at.com

通過調(diào)用 addHandler 方法,我們可以逐步構(gòu)建責(zé)任鏈,將處理者添加到責(zé)任鏈的末尾,由于 setNextChain()  不對外調(diào)用,作用域可以更改為 private,最后,通過調(diào)用 build 方法,我們可以獲取責(zé)任鏈的起始處理者。1CG28資訊網(wǎng)——每日最新資訊28at.com

Spring中使用責(zé)任鏈模式

Spring中我們可以使用 @Component,@Order 注解,來讓容器幫我們自動構(gòu)建責(zé)任鏈,從而簡化代碼。1CG28資訊網(wǎng)——每日最新資訊28at.com

public abstract class Handler {    abstract void handler(LeaveRequest request);}
@Order(value = 1)@Component@Slf4jpublic class HandlerA extends Handler{    @Override    public void handler(LeaveRequest request) {        if (request.getDays() <= 3) {            log.info("ConcreteHandlerA 處理了 " + request.getEmployee() + " 的請假申請,天數(shù)為:" + request.getDays());        }    }}@Order(value = 2)@Component@Slf4jpublic class HandlerB extends Handler {    @Override    public void handler(LeaveRequest request) {        if (request.getDays() > 3 && request.getDays() <= 7) {            log.info("ConcreteHandlerB 處理了 " + request.getEmployee() + " 的請假申請,天數(shù)為:" + request.getDays());        }    }}@Order(value = 3)@Component@Slf4jpublic class HandlerC extends Handler{    @Override    public void handler(LeaveRequest request) {        if (request.getDays() > 7) {            log.info("ConcreteHandlerC 處理了 " + request.getEmployee() + " 的請假申請,天數(shù)為:" + request.getDays());        }    }}

測試:1CG28資訊網(wǎng)——每日最新資訊28at.com

@Testpublic void test() {        for (Handler handler : handlerChain) {            LeaveRequest request =  new LeaveRequest("王五", 10);            handler.handler(request);        }    }

輸出:1CG28資訊網(wǎng)——每日最新資訊28at.com

ConcreteHandlerC 處理了 王五 的請假申請,天數(shù)為:10

這種寫法有其利弊,優(yōu)點是可以避免繁瑣的責(zé)任鏈構(gòu)建過程,簡化了代碼結(jié)構(gòu);缺點是具體處理者類之間的執(zhí)行順序不夠直觀,具體使用時需要權(quán)衡考慮。1CG28資訊網(wǎng)——每日最新資訊28at.com

責(zé)任鏈模式的優(yōu)點在于其低耦合性、靈活性和可擴(kuò)展性,使得我們能夠更加輕松地管理和組織復(fù)雜的處理流程。然而,也要注意其缺點,即請求未必被處理和對處理順序敏感的特點。1CG28資訊網(wǎng)——每日最新資訊28at.com

最重要的是,在實際應(yīng)用中根據(jù)具體需求合理運用責(zé)任鏈模式,結(jié)合其他設(shè)計模式,以便在代碼結(jié)構(gòu)和可維護(hù)性上取得更好的效果。1CG28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-70450-0.html一文搞懂設(shè)計模式—責(zé)任鏈模式

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起聊聊C#實現(xiàn)JSON序列化和反序列化?

下一篇: 基于WebCodecs的網(wǎng)頁端高性能視頻截幀

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久精品动漫| 亚洲国产91色在线| 欧美午夜精品久久久久久孕妇| 欧美日韩免费精品| 欧美日韩一区二区三区| 国产精品美女999| 国产一区白浆| 亚洲国产一区二区三区在线播| 欧美成人午夜激情视频| 欧美成人精品激情在线观看| 欧美日韩一区不卡| 国产日韩精品在线观看| 精品91在线| 99这里只有精品| 午夜日韩电影| 女人天堂亚洲aⅴ在线观看| 国产精品vvv| 黄色日韩网站视频| 一区二区三区四区国产| 久久久久久久91| 欧美三级不卡| 在线观看亚洲视频| 亚洲一区在线看| 欧美韩日高清| 国产在线观看91精品一区| 亚洲免费高清| 久热精品视频在线| 国产精品亚洲成人| 亚洲免费观看高清在线观看| 久久国产精品一区二区| 欧美日本在线视频| 狠狠入ady亚洲精品| 一区二区三区日韩精品视频| 久久午夜av| 国产精品美女久久久久久2018| 91久久久一线二线三线品牌| 亚洲综合久久久久| 欧美午夜精品久久久久久久| 国产亚洲a∨片在线观看| 亚洲黄网站黄| 亚洲专区一区二区三区| 久久精品午夜| 欧美日韩国产一区二区| 国产一区二区电影在线观看 | 欧美一区视频| 欧美成人精品1314www| 国产精品白丝av嫩草影院| 国产一区在线看| 亚洲手机成人高清视频| 久久综合网hezyo| 国产精品萝li| 亚洲精品激情| 久久精品一区蜜桃臀影院| 欧美日韩美女在线| 一区二区三区在线观看国产| 亚洲一区亚洲二区| 久久久亚洲成人| 国产精品成人va在线观看| 亚洲国产精品成人| 欧美专区在线播放| 欧美视频中文字幕在线| 亚洲激情校园春色| 久久不射中文字幕| 国产精品国产三级国产专播精品人| 91久久精品国产91久久性色| 亚洲自拍偷拍网址| 欧美精品七区| 韩国三级在线一区| 亚洲欧美国产一区二区三区| 欧美猛交免费看| 在线观看日韩www视频免费 | 在线观看三级视频欧美| 性欧美精品高清| 欧美色图麻豆| 亚洲精品视频啊美女在线直播| 久久久成人网| 国产欧美日韩不卡| 亚洲天堂成人| 欧美区在线观看| 亚洲高清色综合| 久久国产精品高清| 国产综合精品一区| 午夜精品久久久久久| 欧美日韩一区二区免费视频| 亚洲精品免费一二三区| 免费av成人在线| 国外视频精品毛片| 欧美一区二区三区免费观看| 国产精品视频大全| 亚洲综合精品自拍| 国产精品美女主播| 亚洲视频中文| 久久久久九九九| 在线观看日韩av电影| 久久综合久久久久88| 在线观看成人av电影| 久久先锋资源| 尤物yw午夜国产精品视频| 久久久久久久一区二区| 国产在线欧美日韩| 久久久久网址| 影音国产精品| 欧美jizz19hd性欧美| 夜夜爽av福利精品导航| 欧美日韩亚洲综合| 亚洲视频福利| 国产精品久99| 午夜天堂精品久久久久| 国产欧美日韩专区发布| 欧美一区二区三区四区在线观看| 国产精品有限公司| 欧美一区二视频在线免费观看| 国产精品热久久久久夜色精品三区| 亚洲视频欧洲视频| 欧美日韩1区2区| 日韩一二三区视频| 欧美视频免费在线观看| 亚洲手机在线| 国产欧美va欧美va香蕉在| 欧美在线91| 伊人激情综合| 伊人久久亚洲热| 欧美日韩国产精品专区| 国产精品豆花视频| 国产精品自拍网站| 国产精品极品美女粉嫩高清在线| 免费观看成人| 久久久精品999| 欧美大片免费| 欧美18av| 国产精品美女在线| 国产在线不卡精品| 91久久极品少妇xxxxⅹ软件| 日韩午夜精品| 久久亚洲综合色| 欧美韩日一区| 国产日韩欧美一区二区| 日韩午夜电影av| 久久久久免费| 久久综合狠狠综合久久综青草| 亚洲一区二区三区欧美| 男人天堂欧美日韩| 欧美日韩一区三区四区| 欧美精品日韩精品| 亚洲资源av| 久久久噜噜噜久久中文字幕色伊伊 | 在线观看国产日韩| 日韩亚洲欧美在线观看| 蜜臀av在线播放一区二区三区| 国产精品你懂的在线欣赏| 亚洲电影免费观看高清| 亚洲综合精品| 亚洲一级影院| 欧美剧在线观看| 午夜精品久久久久久久白皮肤| 黄网动漫久久久| 国产精品av久久久久久麻豆网| 久久久高清一区二区三区| 在线亚洲伦理| 精品va天堂亚洲国产| 欧美激情国产日韩精品一区18| 欧美在线精品免播放器视频| 亚洲国产另类 国产精品国产免费| 国产精品一区久久久久| 欧美69wwwcom| 欧美在线综合| 一区二区三区精品国产| 国产精品视频一二| 夜夜嗨av一区二区三区四季av| 久久天天躁狠狠躁夜夜av| 国户精品久久久久久久久久久不卡 | 亚洲免费黄色| 国产日韩精品久久久| 亚洲欧美日韩在线| 99国内精品久久| 国语自产偷拍精品视频偷| 欧美精品久久天天躁| 亚洲日本精品国产第一区| 久久久久一区二区三区| 亚洲卡通欧美制服中文| 国产视频一区二区在线观看| 欧美精品一区二区高清在线观看| 欧美一区二区日韩一区二区| 99国产精品久久久久久久成人热 | 国产精品看片资源| 欧美成人一区二区在线 | 欧美顶级少妇做爰| 久久狠狠婷婷| 亚洲视频视频在线| 亚洲国产经典视频| 国产视频不卡| 国产精品福利网| 欧美国产第一页| 久久亚洲视频| 一本久久青青| 亚洲高清在线播放| 国产日韩欧美制服另类| 欧美午夜精品电影| 欧美激情一区二区在线| 久久综合狠狠| 久久看片网站| 久久久久久久999精品视频| 欧美在线一级视频| 夜夜精品视频|