zoukankan      html  css  js  c++  java
  • 设计模式 责任链模式

    责任链模式:当多个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("验证失败");
            }
        }
    }
    
  • 相关阅读:
    [日志]“著名”炒股实用口诀
    Taven教授:解决失眠的好办法
    [日志]挂在树上的茶壶
    [日志]教你把脉知生男生女
    [日志]看了很多次的十句话
    [健康]国家制定公布甲型流感中药方市民可食用预防
    初学者如何开发出高质量J2EE系统
    学老中医的顺口溜防病
    [健康]巧用药茶疗慢性咽炎
    [日志]说一个人长的丑!如何说?
  • 原文地址:https://www.cnblogs.com/kiqi/p/14045051.html
Copyright © 2011-2022 走看看