设计模式 - 责任链模式

责任链模式:当多个Handler都有机会处理同一个请求时,可以让这些Handler形成一条链,并沿着这条链传递该请求
核心:请求与处理解耦合,通过链依次传递处理。
案例:拦截器链,pipeline处理链
设计模式之禅 - 责任链模式

general

// 责任链模式:使请求和处理解耦,只需把请求传入链中,即可让请求被链中的所有节点依次处理。
public class Test {
    public static void main(String[] args) {
        MemberInfo memberInfo = new MemberInfo("kiqi007","i20132014");
        Handler handler = new Handler.Builder()
                            .addHandler(new LoginHandler())
                            .addHandler(new AuthHandler())
                            .build();
        handler.handlerRequest(memberInfo);
    }
}

Abstract

// 抽象的handler类 - 责任链的核心在于链式调用(根据具体的应用场景可存在较多的变形)
public abstract class Handler {
    // 指向下一个节点的
    protected Handler next;

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

    // 主要的处理逻辑 - ①判断是否需要处理请求 ②判断是否要传递给下一个节点
    public abstract void handlerRequest(MemberInfo memberInfo);

    // 模板方法
    protected void nextHandlerIfExist(MemberInfo memberInfo){
        if(this.next != null){
            this.next.handlerRequest(memberInfo);
        }
    }

    // 链的构造器 - 建造者模式,简化链的构造过程
    public static class Builder{
        private Handler head;
        private Handler tail;

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

        public Handler build(){
            return head;
        }
    }
}

Implements

public class LoginHandler extends Handler {
    @Override
    public void handlerRequest(MemberInfo memberInfo) {
        if(memberInfo.getLogin() == 0){
            login(memberInfo);
        }
        if(memberInfo.getLogin() == 1) {
            nextHandlerIfExist(memberInfo);
        }
    }

    private void login(MemberInfo memberInfo) {
        System.out.println(memberInfo.getUsername() + " login!");
        memberInfo.setLogin(1);
        if(Math.random() > 0.5){
            memberInfo.setAuth(1);
        }
    }
}
public class AuthHandler extends Handler{
    @Override
    public void handlerRequest(MemberInfo memberInfo) {
        if(memberInfo.getAuth() == 1){
            System.out.println("验证通过");
            nextHandlerIfExist(memberInfo);
        }else {
            System.out.println("验证失败");
        }
    }
}
posted @ 2020-11-26 22:36  祁奇  阅读(71)  评论(0编辑  收藏  举报