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

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

 更新時(shí)間:2021年04月30日 10:44:35   作者:yyangqqian  
這篇文章主要介紹了Java設(shè)計(jì)模式之責(zé)任鏈模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、前言

各個(gè)部門(mén)協(xié)同合作完成一個(gè)任務(wù),每個(gè)部門(mén)都有各自的職責(zé),一個(gè)部門(mén)完成后,變回轉(zhuǎn)交給下一個(gè)部門(mén),直到所有部門(mén)都處理了,這個(gè)任務(wù)才完成。

將請(qǐng)求與處理解耦。
處理者只需要關(guān)注自己感興趣的請(qǐng)求進(jìn)行處理,對(duì)于不感興趣的請(qǐng)求,直接轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn)對(duì)象。

二、登錄校驗(yàn)舉例。

1、校驗(yàn)用戶名或密碼是否為空。

2、校驗(yàn)用戶名是否存在。

3、校驗(yàn)是否有權(quán)限。

@Data
public class Member {
    private String loginName;
    private String loginPass;
    private String roleName;
    public Member(String loginName, String loginPass) {
        this.loginName = loginName;
        this.loginPass = loginPass;
    }
}

傳統(tǒng)編碼,在同一個(gè)方法里一個(gè)一個(gè)進(jìn)行判斷。

public class MemberService {
    public void login(String loginName, String loginPass) {
        if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(loginPass)) {
            System.out.println("用戶名或密碼不為空,校驗(yàn)失敗");
            return;
        }
        System.out.println("用戶名、密碼校驗(yàn)成功");
        if (!"James".equals(loginName)) {
            System.out.println("用戶不存在");
            return;
        }
        Member member = new Member();
        member.setRoleName("管理員");
        if (!"管理員".equals(member.getRoleName())) {
            System.out.println("您不是管理員,沒(méi)有權(quán)限");
            return;
        }
        System.out.println("登錄成功");
    }
    public static void main(String[] args) {
        MemberService memberService = new MemberService();
        memberService.login("Ja1mes", "null");
    }
}

使用責(zé)任鏈和建造者結(jié)合模式,將每個(gè)步驟處理連起來(lái)。
抽象出處理類。

public abstract class Handler<T> {
	// 指向下一個(gè)處理類
    protected Handler chain;
    // 設(shè)置下一個(gè)處理類
    public void next(Handler handler) {
        this.chain = handler;
    }
    // 具體處理邏輯
    public abstract void doHandler(Member member);
    // 構(gòu)建一條鏈?zhǔn)教幚磉壿?
    public static class Builder<T> {
    	// 第一個(gè)處理類
        private Handler<T> head;
        // 最后一個(gè)處理類
        private Handler<T> tail;
        // 從頭開(kāi)始添加處理類
        public Builder<T> addHandler(Handler<T> handler) {
            if (this.head == null) {
            	// 只有一個(gè)處理類,所以不需要設(shè)置下一個(gè)處理類
                this.head = this.tail = handler;
                return this;
            }
            // 設(shè)置下一個(gè)處理類
            this.tail.next(handler);
            // 尾部設(shè)置為下一個(gè)處理類的引用
            this.tail = handler;
            return this;
        }
        // 返回的是第一個(gè)處理類
        public Handler<T> builder() {
            return this.head;
        }
    }
}

具體實(shí)現(xiàn)三個(gè)處理類,來(lái)進(jìn)行分別校驗(yàn)

public class ValidateHandler extends Handler {
    @Override
    public void doHandler(Member member) {
        if (StringUtils.isEmpty(member.getLoginName()) || StringUtils.isEmpty(member.getLoginPass())) {
            System.out.println("用戶名或密碼不為空,校驗(yàn)失敗");
            return;
        }
        System.out.println("用戶名、密碼校驗(yàn)成功");
        chain.doHandler(member);
    }
}

public class LoginHandler extends Handler {
    @Override
    public void doHandler(Member member) {
        if (!"James".equals(member.getLoginName())){
            System.out.println("用戶名不存在");
            return;
        }
        System.out.println("登錄成功");
        member.setRoleName("管理員");
        chain.doHandler(member);
    }
}

public class AuthHandler extends Handler {
    @Override
    public void doHandler(Member member) {
        if (!"管理員".equals(member.getRoleName())) {
            System.out.println("您不是管理員,沒(méi)有權(quán)限");
            return;
        }
        System.out.println("您是管理員,允許操作");
    }
}
public class MemberService {
    public void login(String loginName, String loginPass) {
    	// 構(gòu)建一條鏈?zhǔn)教幚?
        Handler.Builder builder = new Handler.Builder()
                .addHandler(new ValidateHandler())
                .addHandler(new LoginHandler())
                .addHandler(new AuthHandler());
        // 從第一個(gè)處理類執(zhí)行到最后一個(gè)處理類
        builder.builder().doHandler(new Member("James11", "1234"));
    }

    public static void main(String[] args) {
        MemberService memberService = new MemberService();
        memberService.login("Ja1mes", "1234");
    }
}

三、Spring使用的責(zé)任鏈模式

過(guò)濾器,可以配置多個(gè)過(guò)濾器來(lái)干不同的事情,然后一個(gè)一個(gè)執(zhí)行。

FilterChain。

在這里插入圖片描述

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

相關(guān)文章

  • java字符串求并集的方法

    java字符串求并集的方法

    這篇文章主要介紹了java字符串求并集的方法,涉及Java字符串操作中union方法的使用,是Java字符串操作中非常實(shí)用的基本技巧,需要的朋友可以參考下
    2014-11-11
  • Java中ByteArrayOutputStream亂碼問(wèn)題解決

    Java中ByteArrayOutputStream亂碼問(wèn)題解決

    本文主要介紹了Java中ByteArrayOutputStream亂碼問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java運(yùn)用SWT插件編寫(xiě)桌面記事本應(yīng)用程序

    Java運(yùn)用SWT插件編寫(xiě)桌面記事本應(yīng)用程序

    這篇文章主要為大家介紹了一個(gè)Java項(xiàng)目實(shí)戰(zhàn),一步步教你實(shí)現(xiàn)記事本,步驟很詳細(xì),運(yùn)用SWT插件手把手編寫(xiě)記事本,感興趣的小伙伴們可以參考一下
    2016-01-01
  • SpringBoot嵌套事務(wù)詳解及失效解決方案

    SpringBoot嵌套事務(wù)詳解及失效解決方案

    在復(fù)雜的業(yè)務(wù)場(chǎng)景中,嵌套事務(wù)可以幫助我們更加精細(xì)地控制數(shù)據(jù)的一致性,然而,在 Spring Boot 中,如果嵌套事務(wù)的配置不當(dāng),可能會(huì)導(dǎo)致事務(wù)不生效的問(wèn)題,尤其是在同一個(gè)類中進(jìn)行方法調(diào)用時(shí),本文將詳細(xì)介紹嵌套事務(wù)的原理、失效的原因以及解決方案
    2025-01-01
  • Java面向?qū)ο笾^承的概念詳解

    Java面向?qū)ο笾^承的概念詳解

    這篇文章主要介紹了Java面向?qū)ο笾^承的概念詳解,Java是一種面向?qū)ο蟮木幊陶Z(yǔ)言,繼承是實(shí)現(xiàn)面向?qū)ο缶幊痰幕A(chǔ)之一。通過(guò)繼承,我們可以使代碼更具可讀性、可重用性和可維護(hù)性,從而提高程序的效率和可靠性,需要的朋友可以參考下
    2023-04-04
  • 創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析

    創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析

    這篇文章主要介紹了創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java常見(jiàn)的序列化方式

    java常見(jiàn)的序列化方式

    這篇文章主要為大家詳細(xì)介紹了java中兩種常見(jiàn)的序列化方式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java定義泛型接口和類的方法實(shí)例分析

    Java定義泛型接口和類的方法實(shí)例分析

    這篇文章主要介紹了Java定義泛型接口和類的方法,結(jié)合實(shí)例形式分析了泛型相關(guān)概念、原理及泛型接口與類的定義實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-08-08
  • 并發(fā)編程模式之ThreadLocal源碼和圖文解讀

    并發(fā)編程模式之ThreadLocal源碼和圖文解讀

    這篇文章主要介紹了并發(fā)編程模式之ThreadLocal源碼和圖文解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringBoot+kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能詳解

    SpringBoot+kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-01-01

最新評(píng)論

开鲁县| 延长县| 大安市| 炎陵县| 桂阳县| 江陵县| 宜兰县| 门头沟区| 福安市| 云南省| 卢湾区| 克什克腾旗| 奉节县| 色达县| 临泽县| 海丰县| 屏东市| 大庆市| 罗定市| 喀什市| 吉首市| 和顺县| 垦利县| 普兰县| 敖汉旗| 阿坝县| 贺州市| 蕲春县| 昌都县| 理塘县| 贞丰县| 临汾市| 桃园市| 三门县| 扎赉特旗| 盐池县| 革吉县| 诏安县| 长白| 盐城市| 沿河|