責任鏈模式(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","管理員"));
}
}