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

Java設(shè)計模式-責(zé)任鏈模式

這篇具有很好參考價值的文章主要介紹了Java設(shè)計模式-責(zé)任鏈模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

責(zé)任鏈模式

1.責(zé)任鏈模式含義

責(zé)任鏈模式,有的地方也會叫職責(zé)鏈模式。它指的是,為請求者和被請求者之間創(chuàng)建一條對象處理鏈路,避免請求發(fā)送者與接受者耦合在一起。

在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任

責(zé)任鏈模式里的責(zé)任,指的是類對象所承擔(dān)的職責(zé),當(dāng)每一個對象對其下家引用,就會形成一條鏈路,那么這一條鏈上的所有的對象的職責(zé)也就串起來了,這樣就形成了責(zé)任鏈,責(zé)任鏈的名字就是這樣來的。

2.責(zé)任鏈代碼示例

2.1Request類

Request類用于封裝請求的相關(guān)內(nèi)容

public class Request {
    private String requestType;

    private String requestContent;

    private int number;

    public String getRequestType() {
        return requestType;
    }

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public String getRequestContent() {
        return requestContent;
    }

    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

2.2Manager類

Manager類是被請求類,用于處理請求

public class Manager {
    protected String name;

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

    public void getResult(String managerLevel, Request request){
        if ("經(jīng)理".equals(managerLevel)) {
            if ("請假".equals(request.getRequestType()) && request.getNumber() <= 2){
                System.out.println(String.format("%s%s請假%d被批準", name, request.getRequestContent(), request.getNumber()));
            } else {
                System.out.println(String.format("%s%s請假%d我無權(quán)處理", name, request.getRequestContent(), request.getNumber()));
            }
        } else if ("總監(jiān)".equals(managerLevel)) {
            if ("請假".equals(request.getRequestType()) && request.getNumber() <= 5){
                System.out.println(String.format("%s%s請假%d被批準", name, request.getRequestContent(), request.getNumber()));
            } else {
                System.out.println(String.format("%s%s請假%d我無權(quán)處理", name, request.getRequestContent(), request.getNumber()));
            }
        } else if ("總經(jīng)理".equals(managerLevel)) {
            if ("請假".equals(request.getRequestType()) ){
                System.out.println(String.format("%s%s請假%d被批準", name, request.getRequestContent(), request.getNumber()));
            } else if ("加薪".equals(request.getRequestType()) && request.getNumber() <= 500){
                System.out.println(String.format("%s%s數(shù)量%d被批準", name, request.getRequestContent(), request.getNumber()));
            } else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500){
                System.out.println(String.format("%s%s數(shù)量%d再說吧", name, request.getRequestContent(), request.getNumber()));
            }
        }
    }
}

可以看到,Manager類的getResult方法里面,有大量的條件判斷分支,這就導(dǎo)致了Manager這個類的職責(zé)太大了,違反了單一職責(zé)的原則,如果增加新的職位,比如總經(jīng)理秘書,那么就要修改原代碼,并對這個復(fù)雜的分支再加上新的條件分支,也違背了開閉原則。所以需要對這個類進行改造,而改造這個類,就使用責(zé)任鏈模式。

2.3Manager類重構(gòu)

1.首先將Manager類改為抽象類,抽象類中設(shè)置一個Manage屬性,并定義抽象的請求處理方法。

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 requestApplications(Request request);
}

2.新建Manager的子類CommonManger,負責(zé)處理原Manager類中的第一個if條件分支

public class CommonManager extends Manager{
    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void requestApplications(Request request) {
        if ("請假".equals(request.getRequestType()) && request.getNumber() <= 2){
            System.out.println(String.format("%s%s請假%d被批準", name, request.getRequestContent(), request.getNumber()));
        } else {
            if (superior != null) {
                superior.requestApplications(request);
            }
        }
    }
}

3.新建Manager的子類Majordomo類,負責(zé)處理原Manager類中的第二個if條件分支

public class Majordomo extends Manager{
    public Majordomo(String name) {
        super(name);
    }

    @Override
    public void requestApplications(Request request) {
        if ("請假".equals(request.getRequestType()) && request.getNumber() <= 5){
            System.out.println(String.format("%s%s請假%d被批準", name, request.getRequestContent(), request.getNumber()));
        } else {
            if (superior != null) {
                superior.requestApplications(request);
            }
        }
    }
}

4.新建Manager的子類GeneralManager類,負責(zé)處理原Manager類中的第三個if分支

public class GeneralManager extends Manager{
    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void requestApplications(Request request) {
        if ("請假".equals(request.getRequestType()) ){
            System.out.println(String.format("%s%s請假%d被批準", name, request.getRequestContent(), request.getNumber()));
        } else if ("加薪".equals(request.getRequestType()) && request.getNumber() <= 500){
            System.out.println(String.format("%s%s數(shù)量%d被批準", name, request.getRequestContent(), request.getNumber()));
        } else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500){
            System.out.println(String.format("%s%s數(shù)量%d再說吧", name, request.getRequestContent(), request.getNumber()));
        }
    }
}

5.測試類

public class MainApp {
    public static void main(String[] args) {
        CommonManager jingli = new CommonManager("經(jīng)理");
        Majordomo zongjian = new Majordomo("總監(jiān)");
        GeneralManager zjingli = new GeneralManager("總經(jīng)理");

        jingli.setSuperior(zongjian);
        zongjian.setSuperior(zjingli);

        Request request = new Request();
        request.setRequestType("請假");
        request.setRequestContent("秋秋請假");
        request.setNumber(1);
        jingli.requestApplications(request);

        Request request2 = new Request();
        request2.setRequestType("請假");
        request2.setRequestContent("秋秋請假");
        request2.setNumber(4);
        jingli.requestApplications(request2);

        Request request3 = new Request();
        request3.setRequestType("加薪");
        request3.setRequestContent("秋秋要加薪");
        request3.setNumber(500);
        jingli.requestApplications(request3);

        Request request4 = new Request();
        request4.setRequestType("加薪");
        request4.setRequestContent("秋秋要加薪");
        request4.setNumber(10000);
        jingli.requestApplications(request4);

    }
}

運行結(jié)果

經(jīng)理秋秋請假請假1被批準
總監(jiān)秋秋請假請假4被批準
總經(jīng)理秋秋要加薪數(shù)量500被批準
總經(jīng)理秋秋要加薪數(shù)量10000再說吧

從Manager類的改造結(jié)果來看,原來Manager類的條件分支被均勻的分散到新Manager類的三個子類中,新的Manager的三個子類中又相繼調(diào)用了條件分支的下一個子類,最終三個子類串聯(lián)起來,形成了一個責(zé)任鏈。這樣每個子類所承擔(dān)的職責(zé)僅有一個if條件分支,職責(zé)單一,如果要新增新的條件分支,比如新增總經(jīng)理秘書的分支,此時只需要新建一個Manager的子類,總經(jīng)理秘書類,即可完成新分支的創(chuàng)建,不會修改原來的分支,符合開閉原則。

3.總結(jié)

責(zé)任鏈中最關(guān)鍵的就是,當(dāng)客戶提交一個請求的時候,請求是沿著鏈傳遞下去的,直到有一個對象來處理這個請求。請求者不用管哪個對象來處理,反正請求最終會被這個責(zé)任鏈給處理掉。

這就使得接收者和發(fā)送者都沒有對方的明確信息,且鏈中的對象自己也并不知道鏈的結(jié)構(gòu)。結(jié)果是責(zé)任鏈可以簡化為對象的相互連接,它們僅需保持一個指向其后繼者的引用,而不需要保持它所有的候選接受者的引用,這就大大降低了耦合度。

由于鏈式結(jié)構(gòu)是在客戶端定義的,所以客戶端可以隨時地增加或修改處理一個請求的結(jié)構(gòu),增強了給對象指派職責(zé)的靈活性。

不過責(zé)任鏈處理也要考慮全面,防止某個請求一直到鏈的末端都沒有被正確處理。

以上就是責(zé)任鏈模式的內(nèi)容了,責(zé)任鏈這個名字聽著高大上,但其實原理還是很簡單的,不要被名字嚇到。文章來源地址http://www.zghlxwxcb.cn/news/detail-608875.html

到了這里,關(guān)于Java設(shè)計模式-責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月06日
    瀏覽(16)
  • Java 大廠八股文面試專題-設(shè)計模式 工廠方法模式、策略模式、責(zé)任鏈模式

    Java 大廠八股文面試專題-設(shè)計模式 工廠方法模式、策略模式、責(zé)任鏈模式

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

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

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

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

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

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

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

    2024年02月13日
    瀏覽(17)
  • 設(shè)計模式:責(zé)任鏈模式

    責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計模式,它允許多個對象按照順序處理請求,直到其中一個對象能夠處理該請求為止。責(zé)任鏈模式將請求發(fā)送者和接收者解耦,使得多個對象都有機會處理請求,同時避免了請求發(fā)送者與接收者之間的直接耦合關(guān)系。 在

    2024年02月07日
    瀏覽(21)
  • 【設(shè)計模式】責(zé)任鏈模式

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

    顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進行解耦。這種類型的設(shè)計模式屬于行為型模式。 在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處

    2024年02月12日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包