国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《設(shè)計(jì)模式》責(zé)任鏈模式

這篇具有很好參考價(jià)值的文章主要介紹了《設(shè)計(jì)模式》責(zé)任鏈模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

定義

  • 責(zé)任鏈模式將鏈中每一個(gè)節(jié)點(diǎn)都看成一個(gè)對(duì)象,并且將這些節(jié)點(diǎn)對(duì)象連成一條鏈,請(qǐng)求會(huì)沿著這條鏈進(jìn)行傳遞,直到有對(duì)象處理它為止,這使得多個(gè)對(duì)象都有機(jī)會(huì)接收請(qǐng)求,避免了請(qǐng)求發(fā)送者和接收者之間的耦合。
  • 屬于行為型設(shè)計(jì)模式。

責(zé)任鏈模式的角色組成

  • Handler(抽象處理者):定義一個(gè)處理請(qǐng)求的抽象方法,并維護(hù)一個(gè)下一個(gè)處理節(jié)點(diǎn)對(duì)象的引用。
  • ConcreteHandler(具體處理者):實(shí)現(xiàn)了抽象處理請(qǐng)求方法,并在處理之前進(jìn)行判斷是否有相應(yīng)的處理權(quán)限,有則處理,沒(méi)有則將請(qǐng)求轉(zhuǎn)發(fā)后繼者處理。

責(zé)任鏈模式的 UML 類(lèi)圖
《設(shè)計(jì)模式》責(zé)任鏈模式,設(shè)計(jì)模式,設(shè)計(jì)模式,責(zé)任鏈模式,java

??情景案例:大家在公司上班難免遇到有事需要請(qǐng)假的情況,就我所在的公司來(lái)說(shuō),請(qǐng)假時(shí)間不超過(guò)3個(gè)工作日的,自己的直接領(lǐng)導(dǎo)(leader)可以直接審批,但是如果大于三個(gè)工作日不超過(guò)五個(gè)工作日的,則需要經(jīng)理(CommonManager)進(jìn)行審批了,而請(qǐng)假時(shí)間超過(guò)5個(gè)工作日的需要總經(jīng)理(GeneralManager)進(jìn)行審批了。其實(shí),請(qǐng)假審批流程這樣的場(chǎng)景就可以使用責(zé)任鏈模式模擬,提出的請(qǐng)假請(qǐng)求被一層層傳遞轉(zhuǎn)發(fā),直到最終的決策者。

抽象處理者 Manager

public abstract class Manager {
    protected String name;

    protected Manager superior;

    public Manager(String name) {
        this.name = name;
    }

    public void setSuperior(Manager superior) {
        this.superior = superior;
    }

    public abstract void requestAbsence(int days);
}

具體處理者 Leader

public class Leader extends Manager{

    public Leader(String name) {
        super(name);
    }

    @Override
    public void requestAbsence(int days) {
        if (days <= 3) {
            System.out.println(String.format("請(qǐng)假%s天被批準(zhǔn),審核人為%s!", days, name));
        } else {
            if (superior != null) {
                System.out.println(String.format("請(qǐng)假%s天被批準(zhǔn),審核人為%s,還需上級(jí)領(lǐng)導(dǎo)審核!", days, name));
                superior.requestAbsence(days);
            }
        }
    }
}

具體處理者 CommonManager

public class CommonManager extends Manager{

    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void requestAbsence(int days) {
        if (days > 3 && days <= 5) {
            System.out.println(String.format("請(qǐng)假%s天被批準(zhǔn),審核人為%s!", days, name));
        } else {
            if (superior != null) {
                System.out.println(String.format("請(qǐng)假%s天被批準(zhǔn),審核人為%s,還需上級(jí)領(lǐng)導(dǎo)審核!", days, name));
                superior.requestAbsence(days);
            }
        }
    }
}

具體處理者 GeneralManager

public class GeneralManager extends Manager {

    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void requestAbsence(int days) {
        if (days > 5) {
            System.out.println(String.format("請(qǐng)假%s天被批準(zhǔn),審核人為%s!", days, name));
        }
    }
}

客戶(hù)端 Client

public class Client {
    public static void main(String[] args) {
        Leader leader = new Leader("主管");
        CommonManager commonManager = new CommonManager("經(jīng)理");
        GeneralManager generalManager = new GeneralManager("總經(jīng)理");

        leader.setSuperior(commonManager);
        commonManager.setSuperior(generalManager);
      
        leader.requestAbsence(6);
    }
}

責(zé)任鏈模式的優(yōu)點(diǎn)

  • 請(qǐng)求處理對(duì)象僅需維持一個(gè)指向其后繼者的引用,而不需要維持它對(duì)所有的候選處理者的引用,這樣的責(zé)任鏈可以簡(jiǎn)化對(duì)象的相互連接,降低耦合度。
  • 鏈路結(jié)構(gòu)靈活,可以通過(guò)改變鏈路結(jié)構(gòu)動(dòng)態(tài)地新增或刪減責(zé)任。
  • 易于擴(kuò)展新的請(qǐng)求處理類(lèi)(節(jié)點(diǎn)),符合開(kāi)閉原則。

責(zé)任鏈模式的缺點(diǎn)

  • 責(zé)任鏈太長(zhǎng)或者處理時(shí)間過(guò)長(zhǎng),會(huì)影響整體性能。
  • 如果建鏈不當(dāng),可能會(huì)造成循環(huán)調(diào)用,將導(dǎo)致系統(tǒng)陷入死循環(huán)。
  • 一個(gè)請(qǐng)求也可能因職責(zé)鏈沒(méi)有被正確配置而得不到處理。

責(zé)任鏈模式的適用場(chǎng)景

  • 多個(gè)對(duì)象可以處理同一請(qǐng)求,但具體由哪個(gè)對(duì)象處理則在運(yùn)行時(shí)動(dòng)態(tài)決定。
  • 在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交請(qǐng)求。
  • 需要可以動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求,客戶(hù)端可以動(dòng)態(tài)創(chuàng)建責(zé)任鏈來(lái)處理請(qǐng)求,還可以改變鏈中處理者之間的先后次序。

??責(zé)任鏈模式在JDK源碼javax.servlet包中的應(yīng)用

Servlet API 中提供了一個(gè) Filter (過(guò)濾器)接口,通過(guò)過(guò)濾器技術(shù),開(kāi)發(fā)人員可以實(shí)現(xiàn)用戶(hù)在訪(fǎng)問(wèn)某個(gè)目標(biāo)資源之前,對(duì)訪(fǎng)問(wèn)的請(qǐng)求和響應(yīng)進(jìn)行攔截,一般常用于實(shí)現(xiàn) URL 級(jí)別的權(quán)限訪(fǎng)問(wèn)控制、過(guò)濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。

Servlet API 中的 Filter 源碼如下:

public interface Filter {
	// 過(guò)濾器第一次初始化時(shí)執(zhí)行,初始化配置參數(shù),在doFilter()方法之前被調(diào)用
    default void init(FilterConfig filterConfig) throws ServletException {
    }
	// 在客戶(hù)端請(qǐng)求及服務(wù)器端回復(fù)時(shí)都將被自動(dòng)調(diào)用,服務(wù)器每次在調(diào)用web資源之前,都會(huì)先調(diào)用一下該方法
    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
	// 結(jié)束過(guò)濾器,doFilter()方法完成后被調(diào)用
    default void destroy() {
    }
}

Filter 相當(dāng)于責(zé)任鏈模式中的抽象處理者 Handler,它是由 doFilter() 方法的最后一個(gè)參數(shù) FilterChain 實(shí)現(xiàn)一條責(zé)任鏈的,其源碼如下:

public interface FilterChain {

    /**
     * 調(diào)用鏈中的下一個(gè)過(guò)濾器,如果是調(diào)用鏈中最后一個(gè)過(guò)濾器,將調(diào)用鏈中最后一個(gè)資源
     * @param request 將沿著鏈請(qǐng)求
     * @param response 將沿著鏈回復(fù)           
     */
    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
    
}

FilterChain 類(lèi)中只定義了一個(gè) doFilter() 方法上,J2EE 只定義了一個(gè)規(guī)范,具體處理邏輯是由使用者自己來(lái)實(shí)現(xiàn),例如 Spring 框架中的實(shí)現(xiàn) MockFilterChain 類(lèi):

public class MockFilterChain implements FilterChain {
    @Nullable
    private ServletRequest request;
    @Nullable
    private ServletResponse response;
    
    private final List<Filter> filters;
    
    @Nullable
    private Iterator<Filter> iterator;

    public MockFilterChain() {
        this.filters = Collections.emptyList();
    }

    public MockFilterChain(Servlet servlet) {
        this.filters = initFilterList(servlet);
    }

    public MockFilterChain(Servlet servlet, Filter... filters) {
        Assert.notNull(filters, "filters cannot be null");
        Assert.noNullElements(filters, "filters cannot contain null values");
        this.filters = initFilterList(servlet, filters);
    }

    private static List<Filter> initFilterList(Servlet servlet, Filter... filters) {
        Filter[] allFilters = (Filter[])ObjectUtils.addObjectToArray(filters, new MockFilterChain.ServletFilterProxy(servlet));
        return Arrays.asList(allFilters);
    }

    @Nullable
    public ServletRequest getRequest() {
        return this.request;
    }

    @Nullable
    public ServletResponse getResponse() {
        return this.response;
    }

    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        Assert.notNull(request, "Request must not be null");
        Assert.notNull(response, "Response must not be null");
        Assert.state(this.request == null, "This FilterChain has already been called!");
        if (this.iterator == null) {
            this.iterator = this.filters.iterator();
        }

        if (this.iterator.hasNext()) {
            Filter nextFilter = (Filter)this.iterator.next();
            nextFilter.doFilter(request, response, this);
        }

        this.request = request;
        this.response = response;
    }

    public void reset() {
        this.request = null;
        this.response = null;
        this.iterator = null;
    }

    private static final class ServletFilterProxy implements Filter {
        private final Servlet delegateServlet;

        private ServletFilterProxy(Servlet servlet) {
            Assert.notNull(servlet, "servlet cannot be null");
            this.delegateServlet = servlet;
        }

        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            this.delegateServlet.service(request, response);
        }

        public void init(FilterConfig filterConfig) throws ServletException {
        }

        public void destroy() {
        }

        public String toString() {
            return this.delegateServlet.toString();
        }
    }
}

MockFilterChain 類(lèi)把鏈中的所有 Filter 都放到 List 中,然后在調(diào)用 doFilter() 方法時(shí)循環(huán)迭代List,也就是說(shuō) List 中的 Filter 會(huì)按順序執(zhí)行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-543757.html

到了這里,關(guān)于《設(shè)計(jì)模式》責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【設(shè)計(jì)模式】Java 設(shè)計(jì)模式之責(zé)任鏈模式(Chain of Responsibility)

    責(zé)任鏈模式(Chain of Responsibility) 一、概述 責(zé)任鏈模式是一種行為設(shè)計(jì)模式,它允許請(qǐng)求在對(duì)象鏈中傳遞。每個(gè)對(duì)象都有機(jī)會(huì)處理該請(qǐng)求,并且能將其傳遞給鏈中的下一個(gè)對(duì)象。這種模式為請(qǐng)求創(chuàng)建了一個(gè)處理對(duì)象的鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止

    2024年03月22日
    瀏覽(25)
  • 【玩轉(zhuǎn)23種Java設(shè)計(jì)模式】行為型模式篇:責(zé)任鏈模式

    軟件設(shè)計(jì)模式(Design pattern),又稱(chēng)設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。 匯總目錄鏈接:【玩轉(zhuǎn)23種Java設(shè)計(jì)模式】學(xué)習(xí)目錄匯總

    2024年02月13日
    瀏覽(16)
  • Java設(shè)計(jì)模式-責(zé)任鏈(Chain of Responsibility)模式

    Java設(shè)計(jì)模式-責(zé)任鏈(Chain of Responsibility)模式

    Java責(zé)任鏈(Chain of Responsibility)設(shè)計(jì)模式是指很多處理對(duì)象構(gòu)成一個(gè)鏈,鏈中前一個(gè)對(duì)象指向后一個(gè)對(duì)象。請(qǐng)求在鏈中傳遞,一個(gè)請(qǐng)求可以被一個(gè)或者多個(gè)對(duì)象處理。調(diào)用方(即客戶(hù)端)不知道請(qǐng)求會(huì)被鏈中的哪個(gè)對(duì)象處理,所以責(zé)任鏈模式可以方便組織責(zé)任鏈而不影響調(diào)用

    2024年02月16日
    瀏覽(19)
  • Java設(shè)計(jì)模式—責(zé)任鏈模式(Chin of Responsibility)

    Java設(shè)計(jì)模式—責(zé)任鏈模式(Chin of Responsibility)

    目錄 前言 一、責(zé)任鏈模式的簡(jiǎn)介 二、責(zé)任鏈模式的概念 三、責(zé)任鏈模式的作用 四、責(zé)任鏈模式的優(yōu)、缺點(diǎn) 1.責(zé)任鏈模式的優(yōu)點(diǎn) 2.責(zé)任鏈模式的缺點(diǎn) 五、責(zé)任鏈模式的應(yīng)用場(chǎng)景 六、代碼案例 UML類(lèi)圖 ?1.定義一個(gè)請(qǐng)求枚舉類(lèi) ?2.定義一個(gè)請(qǐng)求類(lèi) 3.定義一個(gè)抽象處理接口 4、定

    2024年02月08日
    瀏覽(27)
  • Java 大廠(chǎng)八股文面試專(zhuān)題-設(shè)計(jì)模式 工廠(chǎng)方法模式、策略模式、責(zé)任鏈模式

    Java 大廠(chǎng)八股文面試專(zhuān)題-設(shè)計(jì)模式 工廠(chǎng)方法模式、策略模式、責(zé)任鏈模式

    ????????在平時(shí)的開(kāi)發(fā)中,涉及到設(shè)計(jì)模式的有兩塊內(nèi)容,第一個(gè)是我們 平時(shí)使用的框架 (比如spring、mybatis等),第二個(gè)是我們自己開(kāi)發(fā)業(yè)務(wù)使用的設(shè)計(jì)模式。 ????????面試官一般比較關(guān)心的是你在開(kāi)發(fā)過(guò)程中, 有沒(méi)有使用過(guò)設(shè)計(jì)模式,或者你在簡(jiǎn)歷上寫(xiě)了關(guān)于設(shè)計(jì)

    2024年02月10日
    瀏覽(29)
  • Java設(shè)計(jì)模式之責(zé)任鏈模式(UML類(lèi)圖分析+代碼詳解)

    Java設(shè)計(jì)模式之責(zé)任鏈模式(UML類(lèi)圖分析+代碼詳解)

    大家好,我是一名在算法之路上不斷前進(jìn)的小小程序猿!體會(huì)算法之美,領(lǐng)悟算法的智慧~ 希望各位博友走過(guò)路過(guò)可以給我點(diǎn)個(gè)免費(fèi)的贊,你們的支持是我不斷前進(jìn)的動(dòng)力?。?加油吧!未來(lái)可期!! 本文將介紹java設(shè)計(jì)模式之責(zé)任鏈模式 OA系統(tǒng)采購(gòu)審批需求 傳統(tǒng)方案解決OA系

    2024年02月06日
    瀏覽(16)
  • Java設(shè)計(jì)模式之行為型-責(zé)任鏈模式(UML類(lèi)圖+案例分析)

    Java設(shè)計(jì)模式之行為型-責(zé)任鏈模式(UML類(lèi)圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類(lèi)圖 三、角色設(shè)計(jì) 四、案例分析 4.1、在Java中實(shí)現(xiàn) 4.2、在SpringBoot中實(shí)現(xiàn)? 五、總結(jié)? 責(zé)任鏈模式是一種行為設(shè)計(jì)模式,它允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送。請(qǐng)求會(huì)被鏈上每個(gè)處理者處理,直到請(qǐng)求被處理完畢。該模式主要解決的是請(qǐng)求的發(fā)送者和

    2024年02月15日
    瀏覽(22)
  • 《設(shè)計(jì)模式》責(zé)任鏈模式

    《設(shè)計(jì)模式》責(zé)任鏈模式

    定義 : 責(zé)任鏈模式將鏈中每一個(gè)節(jié)點(diǎn)都看成一個(gè)對(duì)象,并且將這些節(jié)點(diǎn)對(duì)象連成一條鏈,請(qǐng)求會(huì)沿著這條鏈進(jìn)行傳遞,直到有對(duì)象處理它為止,這使得多個(gè)對(duì)象都有機(jī)會(huì)接收請(qǐng)求,避免了請(qǐng)求發(fā)送者和接收者之間的耦合。 屬于 行為型 設(shè)計(jì)模式。 責(zé)任鏈模式的角色組成 :

    2024年02月13日
    瀏覽(16)
  • 設(shè)計(jì)模式——責(zé)任鏈模式

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

    使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,知道有對(duì)象處理它為止。 優(yōu)點(diǎn) 能將請(qǐng)求和處理分開(kāi)。請(qǐng)求者可以不用知道是誰(shuí)處理的,處理者可以不用知道請(qǐng)求的全貌,兩者解耦提高系

    2024年02月15日
    瀏覽(17)
  • 設(shè)計(jì)模式—責(zé)任鏈模式

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

    一、待解決問(wèn)題 : 減少代碼中 if else 語(yǔ)句,降低代碼圈復(fù)雜度或深度,增強(qiáng)可讀性。 1、需求背景: 采購(gòu)訂單創(chuàng)建,需要驗(yàn)證采購(gòu)員、物料、供應(yīng)商、供應(yīng)商的銀行賬號(hào)等信息。如采購(gòu)員權(quán)限到期、或供應(yīng)商失效等問(wèn)題,都無(wú)法下單。 2、代碼如下: 學(xué)習(xí)使用責(zé)任鏈模式后

    2024年02月10日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包