博客 / 詳情

返回

責任鏈模式

通過構建一條流水線,將一個請求按照順序進行多次處理

下面使用一個登錄的例子來實現責任鏈模式

請求體類

public class UserInfo {
    private String username;
    private String password;
    private String role;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

抽象處理類

public abstract class Handler {
    Handler next;

    public void setNext(Handler handler){
        this.next = handler;
    }

    public abstract void handle(UserInfo info);
}

具體處理過程 驗證密碼 → 權限驗證

public class LoginHandler extends Handler{
    @Override
    public void handle(UserInfo info) {
        if ("eacape".equals(info.getUsername()) && "123456".equals(info.getPassword())){
            System.out.println("密碼驗證通過");
            super.next.handle(info);
        }else {
            throw new RuntimeException("賬户或密碼錯誤");
        }
    }
}
public class RoleHandler extends Handler{
    @Override
    public void handle(UserInfo info) {
        if ("1".equals(info.getRole())){
            System.out.println("登錄成功");
        }else {
            throw new RuntimeException("暫無權限");
        }
    }
}

測試

public class ChainTest {
    @Test
    public void test(){
        UserInfo info = new UserInfo();
        info.setUsername("eacape");
        info.setPassword("123456");
        info.setRole("1");
        Handler login = new LoginHandler();
        login.setNext(new RoleHandler());
        login.handle(info);
    }
}
======結果======
密碼驗證通過
登錄成功

可以與建造者模式結合用於構建調用鏈

抽象處理類 & 構造者

public abstract class HandlerBuilder {
    HandlerBuilder next;

    public abstract void handle(UserInfo info);

    public static class  Builder{
        private HandlerBuilder tail;
        private HandlerBuilder head;

        public Builder addHandler(HandlerBuilder handler){
            if (head == null){
                head = tail = handler;
            }else {
                tail.next = handler;
                tail = tail.next;
            }
            return this;
        }

        public HandlerBuilder build(){
            return this.head;
        }
    }
}

具體處理過程

public class LoginHandler extends HandlerBuilder {
    @Override
    public void handle(UserInfo info) {
        if ("eacape".equals(info.getUsername()) && "123456".equals(info.getPassword())){
            System.out.println("密碼驗證通過");
            super.next.handle(info);
        }else {
            throw new RuntimeException("賬户或密碼錯誤");
        }
    }
}
public class RoleHandler extends HandlerBuilder {
    @Override
    public void handle(UserInfo info) {
        if ("1".equals(info.getRole())){
            System.out.println("登錄成功");
        }else {
            throw new RuntimeException("暫無權限");
        }
    }
}

測試

public class ChainTest {
    @Test
    public void test(){
        UserInfo info = new UserInfo();
        info.setUsername("eacape");
        info.setPassword("123456");
        info.setRole("1");
        HandlerBuilder builder = new HandlerBuilder.Builder()
                .addHandler(new LoginHandler())
                .addHandler(new RoleHandler())
                .build();
        builder.handle(info);

    }
}
======結果======
密碼驗證通過
登錄成功
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.