常用的設計模式之責任鏈模式

責任鏈模式(Responsibility Pattern) :

責任鏈模式主要是解耦了請求與處理,客戶只需將請求發送到鏈上即可,無需關心請求的具體
內容
和處理細節,請求會自動進行傳遞直至有節點對象進行處理。適用於以下應用場景:
1、多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態決定;
2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求;
3、可動態指定一組對象處理請求。

類比 :

java小白->初級->中級->高級->專家

類圖:
在這裏插入圖片描述

代碼 (進入登錄界面–>校驗用戶密碼–> 權限校驗):

用戶bean:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Member {
    private String username;
    private String password;
    private String roleName;

}

處理器handler抽象類

public abstract class Handler {

    protected  Handler next;

    abstract void doHandler(Member member);

    //維護下一個節點
    public void setNext(Handler next) {
        this.next = next;
    }
}

進入登錄界面的處理器

public class LoginHandler extends Handler {

    @Override
    void doHandler(Member member) {
        System.out.println("進入登錄界面開始登錄");
        next.doHandler(member);
    }

}

校驗用戶名密碼不爲空的處理器ValidateHandler

public class ValidateHandler extends Handler {
    @Override
    void doHandler(Member member) {
        if(StringUtils.isBlank(member.getUsername())|| StringUtils.isBlank(member.getPassword())) {
            System.out.println("用戶名或密碼不能爲空");
            return;
        }
        System.out.println("用戶名和密碼不爲空,可以往下執行");
        next.doHandler(member);
    }
}

權限處理器AuthHandler

public class AuthHandler extends Handler {
    @Override
    void doHandler(Member member) {
        if("管理員".equalsIgnoreCase(member.getRoleName())){
            System.out.println("有管理員權限,可以執行任意操作");
        } else {
            System.out.println("沒有權限操作");
        }
    }
}

測試SimpleTest

public class SimpleTest {
    public static void main(String[] args) {
        Handler loginHandler = new LoginHandler();
        Handler validateHandler = new ValidateHandler();
        Handler authHandler = new AuthHandler();
        loginHandler.setNext(validateHandler);
        validateHandler.setNext(authHandler);
        loginHandler.doHandler(new Member("dxy","666","管理員"));
    }
}

測試結果:

在這裏插入圖片描述

結合建造者模式的優化寫法:

public abstract class Handler<T> {

    protected Handler next;

    abstract void doHandler(Member member);

    //維護下一個節點
    public void setNext(Handler next) {
        this.next = next;
    }

    public static class Builder<T> {
        //前一個節點
        private Handler<T> head;
        //後一個節點
        private Handler<T> tail;
        public Builder<T> addHandler( Handler handler){
            if (this.head == null) {
                this.head = this.tail = handler;
                return this;
            }
            this.tail.setNext(handler);
            this.tail = handler;
            return this;
        }
        public Handler<T> build(){
            return this.head;
        }
    }
}

測試:

public class Test {
    public static void main(String[] args) {
        Handler.Builder builder = new Handler.Builder();
        builder.addHandler(new LoginHandler())
                .addHandler(new ValidateHandler())
                .addHandler(new AuthHandler()).build().doHandler(new Member("dxy","666","管理員"));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章