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

笨蛋學(xué)設(shè)計(jì)模式行為型模式-責(zé)任鏈模式【18】

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

8.5責(zé)任鏈模式??????

8.5.1概念

? 責(zé)任鏈模式定義了一系列的處理器對(duì)象,每個(gè)處理器對(duì)象都包含對(duì)鏈表中下一個(gè)處理器對(duì)象的引用。在這條請(qǐng)求鏈條中,每當(dāng)一個(gè)請(qǐng)求發(fā)生時(shí),它就會(huì)被傳遞給鏈表的下一個(gè)處理器對(duì)象,直到某個(gè)處理器對(duì)象處理該請(qǐng)求為止。

8.5.2場(chǎng)景

? 在我們公司內(nèi)部審批流程中,若某個(gè)員工提交了請(qǐng)假申請(qǐng),需要經(jīng)過上級(jí)的一系列的審批過程,例如小組長(zhǎng)審批、部門經(jīng)理審批、人事部審批、總經(jīng)理審批等。這些審批過程可以采用責(zé)任鏈模式來(lái)實(shí)現(xiàn),將每個(gè)審批者看作一個(gè)處理器,若某個(gè)處理者無(wú)法處理該申請(qǐng),則將該申請(qǐng)傳遞給下一個(gè)處理者,直到有一個(gè)處理者同意或拒絕該申請(qǐng)為止。

8.5.3優(yōu)勢(shì) / 劣勢(shì)

  • 降低耦合度:請(qǐng)求發(fā)送者和接收者之間不直接交互,而是通過責(zé)任鏈上的多個(gè)對(duì)象進(jìn)行交互,從而降低了它們之間的耦合度
  • 增強(qiáng)靈活性:可以動(dòng)態(tài)地增加或刪除處理器,從而改變請(qǐng)求的處理順序和方式
  • 提高可擴(kuò)展性:因?yàn)槊總€(gè)處理器都只負(fù)責(zé)處理自己能夠處理的請(qǐng)求,所以可以方便地添加新的處理器來(lái)處理新的請(qǐng)求類型

  • 請(qǐng)求未處理:若沒有任何一個(gè)處理器能夠處理該請(qǐng)求,則該請(qǐng)求將被忽略
  • 系統(tǒng)性能降低:由于責(zé)任鏈中可能包含大量的處理器,因此可能會(huì)影響系統(tǒng)的性能

8.5.4責(zé)任鏈模式可分為

  • 處理者Handler:定義一個(gè)處理請(qǐng)求的接口,包含一個(gè)處理請(qǐng)求的抽象方法和指向下一個(gè)處理者的鏈接
  • 具體處理者ConcreteHandler:實(shí)現(xiàn)處理請(qǐng)求的方法,并判斷能否處理請(qǐng)求,若能夠處理請(qǐng)求則進(jìn)行處理,否則將請(qǐng)求傳遞給下一個(gè)處理者
  • 客戶端:創(chuàng)建并組裝處理者對(duì)象鏈,并將請(qǐng)求發(fā)送到鏈上的第一個(gè)處理者

8.5.5責(zé)任鏈模式

package com.technologystatck.designpattern.mode.chainofresponsibility;


public class ChainOfResponsibility {
    public static void main(String[] args) {
        //創(chuàng)建處理者實(shí)例
        ConcreteHandler handlerA = new ConcreteHandler();
        ConcreteHandler handlerB = new ConcreteHandler();
        //...可以繼續(xù)創(chuàng)建其他處理者實(shí)例

        //構(gòu)建責(zé)任鏈
        handlerA.setNextHandler(handlerB);
        //...可以繼續(xù)構(gòu)建責(zé)任鏈

        //發(fā)送請(qǐng)求
        Request request = new Request(/*請(qǐng)求參數(shù)*/);
        handlerA.handleRequest(request);

    }
}

//1.處理者:定義處理請(qǐng)求的接口
interface Handler{
    //處理請(qǐng)求的方法
    void handleRequest(Request request);
    //設(shè)置下一個(gè)處理者的方法
    void setNextHandler(Handler nextHandler);
}

//2.具體處理者:實(shí)現(xiàn)處理請(qǐng)求
class ConcreteHandler implements Handler{
    private Handler nextHandler;

    //具體處理者自己的判斷條件
    private boolean canHandle(Request request){
        //根據(jù)具體情況判斷是否能夠處理請(qǐng)求
        /**
         * 放入自己的判斷條件
         */
        return true;
    }
    @Override
    public void handleRequest(Request request) {
        //根據(jù)具體情況處理請(qǐng)求,若無(wú)法處理則轉(zhuǎn)發(fā)給下一個(gè)處理者
        if(canHandle(request)){
            //處理請(qǐng)求的邏輯
        }else if(nextHandler !=null){
            nextHandler.handleRequest(request);
        }else{
            //無(wú)法處理請(qǐng)求的邏輯,如打印日志等等
        }
    }

    @Override
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler=nextHandler;
    }
}

8.5.6實(shí)戰(zhàn)

8.5.6.1題目描述

小明所在的公司請(qǐng)假需要在OA系統(tǒng)上發(fā)布申請(qǐng),整個(gè)請(qǐng)求流程包括多個(gè)處理者,每個(gè)處理者負(fù)責(zé)處理不同范圍的請(qǐng)假天數(shù),如果一個(gè)處理者不能處理請(qǐng)求,就會(huì)將請(qǐng)求傳遞給下一個(gè)處理者,請(qǐng)你實(shí)現(xiàn)責(zé)任鏈模式,可以根據(jù)請(qǐng)求天數(shù)找到對(duì)應(yīng)的處理者。

審批責(zé)任鏈由主管(Supervisor), 經(jīng)理(Manager)和董事(Director)組成,他們分別能夠處理3天、7天和10天的請(qǐng)假天數(shù)。如果超過10天,則進(jìn)行否決。

8.5.6.2輸入描述

第一行是一個(gè)整數(shù)N(1 <= N <= 100), 表示請(qǐng)求申請(qǐng)的數(shù)量。

接下來(lái)的N行,每行包括一個(gè)請(qǐng)求申請(qǐng)的信息,格式為"姓名 請(qǐng)假天數(shù)"

8.5.6.3輸出描述

對(duì)于每個(gè)請(qǐng)假請(qǐng)求,輸出一行,表示該請(qǐng)求是否被批準(zhǔn)。如果被批準(zhǔn)/否決,輸出被哪一個(gè)職級(jí)的人批準(zhǔn)/否決。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818469.html

8.5.6.4代碼
package com.technologystatck.designpattern.mode.chainofresponsibility;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int nums=scanner.nextInt();
        scanner.nextLine();

        //組織責(zé)任鏈
        LeaveHandler director = new Director();
        LeaveHandler manager = new Manager(director);
        LeaveHandler supervisor = new Supervisor(manager);

        for(int i=0;i<nums;i++){
            String[] input = scanner.nextLine().split(" ");

            if(input.length==2){
                String name=input[0];
                int days=Integer.parseInt(input[1]);
                LeaveRequest request = new LeaveRequest(name, days);
                supervisor.handleRequest(request);
            }else{
                System.out.println("Invalid input");
                return;
            }
        }
    }
}

//請(qǐng)求類
class LeaveRequest{
    private String name;
    private int days;

    public LeaveRequest(String name, int days) {
        this.name = name;
        this.days = days;
    }

    public String getName() {
        return name;
    }

    public int getDays() {
        return days;
    }
}
//處理者:定義接口
interface LeaveHandler{
    void handleRequest(LeaveRequest request);
}

//具體處理者:可以有多個(gè),負(fù)責(zé)具體處理,主要分為Supervisor、Manager、Director
//主管類
class Supervisor implements LeaveHandler{

    //最多3天請(qǐng)假審批
    private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=3;
    //設(shè)置下一個(gè)處理器對(duì)象
    private LeaveHandler nextHandler;

    public Supervisor(LeaveHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        //若請(qǐng)假的天數(shù)小于當(dāng)前處理者所能審批的最大天數(shù),則直接審批通過,否則繼續(xù)傳遞給下一個(gè)處理者。
        if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){
            System.out.println(request.getName()+" Approved by Supervisor.");
        }else if(nextHandler !=null){
            //若下一個(gè)處理器不為空,就直接傳給下一個(gè)處理器
            nextHandler.handleRequest(request);
        }else{
            System.out.println(request.getName()+"Denied by Supervisor.");
        }
    }
}
//經(jīng)理類
class Manager implements LeaveHandler{
    //最多7天請(qǐng)假審批
    private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=7;
    //設(shè)置下一個(gè)處理器對(duì)象
    private LeaveHandler nextHandler;

    public Manager(LeaveHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){
            System.out.println(request.getName()+" Approved by Manager.");
        }else if(nextHandler !=null){
            nextHandler.handleRequest(request);
        }else{
            System.out.println(request.getName()+" Denied by Manager.");
        }
    }
}

//總監(jiān)類
class Director implements LeaveHandler{
    private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=10;

    @Override
    public void handleRequest(LeaveRequest request) {
        if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){
            System.out.println(request.getName()+" Approved by Director.");
        }else{
            System.out.println(request.getName()+" Denied by Director.");
        }
    }
}

8.5.7總結(jié)

  • 優(yōu)點(diǎn):每個(gè)處理者只負(fù)責(zé)處理與自己相關(guān)的請(qǐng)求,客戶端不需要具體時(shí)哪個(gè)處理者處理請(qǐng)求
  • 總結(jié):類似過濾器中的鏈?zhǔn)教幚?,一個(gè)請(qǐng)求不斷地在鏈?zhǔn)街袀魅胂乱粋€(gè)處理者,直到有一個(gè)處理者能處理該請(qǐng)求
  • 場(chǎng)景:適用于一個(gè)請(qǐng)求會(huì)被多個(gè)處理者進(jìn)行處理,并且整條責(zé)任鏈模式中會(huì)有合適的處理者來(lái)處理請(qǐng)求

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

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • 笨蛋學(xué)設(shè)計(jì)模式行為型模式-命令模式【19】

    8.6.1概念 ? 命令模式允許將請(qǐng)求封裝成一個(gè)對(duì)象(命令對(duì)象,包含執(zhí)行操作所需地所有信息),并將命令對(duì)象按照一定的順序存儲(chǔ)在隊(duì)列中,然后再逐一調(diào)用執(zhí)行,這些命令可以支持反向操作,進(jìn)行撤銷和重做。這樣發(fā)送者就只需要觸發(fā)命令就可以完成操作,不需要知道接受者

    2024年01月23日
    瀏覽(23)
  • 笨蛋學(xué)設(shè)計(jì)模式行為型模式-訪問者模式【21】

    8.8.1概念 ? 訪問者模式是一種將操作邏輯與對(duì)象結(jié)構(gòu)分離的方法,使得操作可以獨(dú)立變化,操作邏輯被封裝在獨(dú)立的訪問者類中,并在被訪問的元素類中提供接受訪問者的方法,而不是直接嵌入到數(shù)據(jù)結(jié)構(gòu)中的對(duì)象中。 8.8.2場(chǎng)景 ? 我們可以將一個(gè)購(gòu)物商場(chǎng)中的商品類作為元

    2024年01月23日
    瀏覽(23)
  • 笨蛋學(xué)設(shè)計(jì)模式行為型模式-備忘錄模式【22】

    8.9.1概念 ? 備忘錄模式允許在不暴露對(duì)象實(shí)現(xiàn)細(xì)節(jié)的情況下捕獲和恢復(fù)對(duì)象的內(nèi)部狀態(tài)。通過將對(duì)象的狀態(tài)封裝在備忘錄對(duì)象中,并將備忘錄對(duì)象保存在一個(gè)管理者對(duì)象中,可以在需要時(shí)回滾到對(duì)象之前的狀態(tài)。 8.9.2場(chǎng)景 ? 在現(xiàn)代辦公場(chǎng)景中,備忘錄模式可以應(yīng)用于文檔編

    2024年01月25日
    瀏覽(22)
  • 笨蛋學(xué)設(shè)計(jì)模式行為型模式-觀察者模式【14】

    8.1.1概念 ? 觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,當(dāng)主題對(duì)象狀態(tài)發(fā)生變化時(shí),會(huì)通知所有依賴它的觀察者對(duì)象,使它們都能夠得到通知并且被自動(dòng)更新 8.1.2場(chǎng)景 ? 在我們生活中,用戶可以在音樂播放平臺(tái)關(guān)注多個(gè)歌手,而

    2024年01月24日
    瀏覽(27)
  • 笨蛋學(xué)設(shè)計(jì)模式行為型模式-中介者模式【24】

    8.11.1概念 ? 中介者模式通過引入一個(gè)中介者對(duì)象來(lái)封裝一組對(duì)象之間的交互,從而可以使這些對(duì)象不需要直接相互引用,也就是將系統(tǒng)內(nèi)多個(gè)對(duì)象之間的復(fù)雜關(guān)系轉(zhuǎn)化為多個(gè)對(duì)象與中介者之間的簡(jiǎn)單關(guān)系。 8.11.2場(chǎng)景 ? 在生活中,可以看到不少網(wǎng)紅在直播賣貨,也可以看出

    2024年01月23日
    瀏覽(18)
  • 行為型設(shè)計(jì)模式——責(zé)任鏈模式

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

    在現(xiàn)實(shí)生活中,常常會(huì)出現(xiàn)這樣的事例:一個(gè)請(qǐng)求有多個(gè)對(duì)象可以處理,但每個(gè)對(duì)象的處理?xiàng)l件或權(quán)限不同。例如,公司員工請(qǐng)假,可批假的領(lǐng)導(dǎo)有部門負(fù)責(zé)人、副總經(jīng)理、總經(jīng)理等,但每個(gè)領(lǐng)導(dǎo)能批準(zhǔn)的天數(shù)不同,員工必須根據(jù)自己要請(qǐng)假的天數(shù)去找不同的領(lǐng)導(dǎo)簽名,也就

    2024年01月16日
    瀏覽(53)
  • 設(shè)計(jì)模式行為型——責(zé)任鏈模式

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

    目錄 什么是責(zé)任鏈模式 責(zé)任鏈模式的實(shí)現(xiàn) 責(zé)任鏈模式角色 責(zé)任鏈模式類圖 責(zé)任鏈模式舉例 責(zé)任鏈模式代碼實(shí)現(xiàn) 責(zé)任鏈模式的特點(diǎn) 優(yōu)點(diǎn) 缺點(diǎn) 使用場(chǎng)景 注意事項(xiàng) 實(shí)際應(yīng)用 ????????責(zé)任鏈模式(Chain of Responsibility Pattern)又叫職責(zé)鏈模式 , 是一種行為型設(shè)計(jì)模式,它通

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

    責(zé)任鏈模式,有的地方也會(huì)叫職責(zé)鏈模式。它指的是,為請(qǐng)求者和被請(qǐng)求者之間創(chuàng)建一條對(duì)象處理鏈路,避免請(qǐng)求發(fā)送者與接受者耦合在一起。 在責(zé)任鏈模式里,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來(lái)形成一條鏈。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定

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

    當(dāng)一個(gè)請(qǐng)求需要在多個(gè)對(duì)象之間傳遞,每個(gè)對(duì)象都可能處理該請(qǐng)求或?qū)⑵鋫鬟f給下一個(gè)對(duì)象。在這種情況下,需要避免將發(fā)送者與接收者之間的耦合,以及確定請(qǐng)求的處理方式。此時(shí)可使用責(zé)任鏈模式,它的優(yōu)點(diǎn)有降低耦合度(無(wú)需關(guān)心哪個(gè)對(duì)象會(huì)處理請(qǐng)求),靈活性(可以

    2024年02月21日
    瀏覽(19)
  • java設(shè)計(jì)模式(十五)責(zé)任鏈模式

    java設(shè)計(jì)模式(十五)責(zé)任鏈模式

    責(zé)任鏈模式(Chain of Responsibility) 使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有對(duì)象能夠處理它。 抽象處理類: 主要包含一個(gè)指向下一處理類的成員變量 nextHandler 和一個(gè)處理請(qǐng)求的方

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包