欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、前言

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

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

二、登錄校驗(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)編碼,在同一個方法里一個一個進(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("您不是管理員,沒有權(quán)限");
            return;
        }
        System.out.println("登錄成功");
    }
    public static void main(String[] args) {
        MemberService memberService = new MemberService();
        memberService.login("Ja1mes", "null");
    }
}

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

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

具體實(shí)現(xiàn)三個處理類,來進(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("您不是管理員,沒有權(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());
        // 從第一個處理類執(zhí)行到最后一個處理類
        builder.builder().doHandler(new Member("James11", "1234"));
    }

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

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

過濾器,可以配置多個過濾器來干不同的事情,然后一個一個執(zhí)行。

FilterChain。

在這里插入圖片描述

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

相關(guān)文章

  • jfreechart畫折線圖的方法

    jfreechart畫折線圖的方法

    這篇文章主要為大家詳細(xì)介紹了jfreechart畫折線圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解maven配置多倉庫的方法示例

    詳解maven配置多倉庫的方法示例

    這篇文章主要介紹了詳解maven配置多倉庫的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java多態(tài)到底都有啥好處

    Java多態(tài)到底都有啥好處

    Java中的多態(tài)性有兩種類型:編譯時多態(tài)(靜態(tài)綁定)和運(yùn)行時多態(tài)(動態(tài)綁定)。方法重載是靜態(tài)多態(tài)的一個例子,而方法重寫是動態(tài)多態(tài)的一個例子,接下來通過本文給大家分享Java多態(tài)到底教了我干啥?有啥好處,一起了解下吧
    2021-05-05
  • 最新評論