• 责任链模式


    责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    概述

    使用多个对象处理用户请求,这些对象组织成一条责任链A-B-C-D。收到用户请求时,A先接收到用户请求,根据需要处理,这时可以直接响应用户,也可以把用户请求分派给下一个对象B。因此每个对象都含有后继对象的引用。

    模式的结构

    处理者(Handler):一个接口,规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法。

    具体处理者:实现处理者接口的类的实例,处理用户请求并决定是否将用户请求交给后继对象处理。

    模式的使用

    用户提交一个人的身份证号码,想知道该人是否在北京、上海或天津居住。

    处理者:Handler.java

    /**
     * 处理者
     */
    public interface Handler {
        void handleRequest(String number);
        void setNextHandler(Handler handler);
    }
    

    具体处理者1:Beijing.java

    import java.util.ArrayList;
    
    /**
     * Beijing
     */
    public class Beijing implements Handler{
        private Handler handler;
        private ArrayList<String> numList;
        Beijing(){
            numList = new ArrayList<String>();
            numList.add("432189571389351");
            numList.add("432189571389352");
            numList.add("432189571389353");
            numList.add("432189571389354");
        }
        public void handleRequest(String number){
            if(numList.contains(number)){
                System.out.println("该人在北京居住");
            }else{
                System.out.println("该人不在北京居住");
                if(handler!=null){
                    handler.handleRequest(number);
                }
            }
        }
        public void setNextHandler(Handler handler){
            this.handler=handler;
        }
    }
    

    具体处理者2:Shanghai.java

    /**
     * Shanhai
     */
    import java.util.ArrayList;
    
    /**
     * Beijing
     */
    public class Shanghai implements Handler{
        private Handler handler;
        private ArrayList<String> numList;
        Shanghai(){
            numList = new ArrayList<String>();
            numList.add("532189571389351");
            numList.add("532189571389352");
            numList.add("532189571389353");
            numList.add("532189571389354");
        }
        public void handleRequest(String number){
            if(numList.contains(number)){
                System.out.println("该人在上海居住");
            }else{
                System.out.println("该人不在上海居住");
                if(handler!=null){
                    handler.handleRequest(number);
                }
            }
        }
        public void setNextHandler(Handler handler){
            this.handler=handler;
        }
    }
    

    具体处理者3:Tianjin.java

    /**
     * Tianjin
     */
    import java.util.ArrayList;
    
    /**
     * Tianjin
     */
    public class Tianjin implements Handler{
        private Handler handler;
        private ArrayList<String> numList;
        Tianjin(){
            numList = new ArrayList<String>();
            numList.add("632189571389351");
            numList.add("632189571389352");
            numList.add("632189571389353");
            numList.add("632189571389354");
        }
        public void handleRequest(String number){
            if(numList.contains(number)){
                System.out.println("该人在天津居住");
            }else{
                System.out.println("该人不在天津居住");
                if(handler!=null){
                    handler.handleRequest(number);
                }
            }
        }
        public void setNextHandler(Handler handler){
            this.handler=handler;
        }
    }
    

     程序应用

    /**
     * 应用程序
     */
    public class Application {
        private Handler beijing,shanghai,tianjin;
        public void createChain(){
            beijing = new Beijing();
            shanghai = new Shanghai();
            tianjin = new Tianjin();
            beijing.setNextHandler(shanghai);
            shanghai.setNextHandler(tianjin);
        }
        public void responseClient(String number){
            beijing.handleRequest(number);
        }
        public static void main(String[] args){
            Application application = new Application();
            application.createChain();
            application.responseClient("632189571389352");
        }
    }
    
    该人不在北京居住
    该人不在上海居住
    该人在天津居住
    

     责任链模式的优点

    • 责任链的对象只和自己的后继对象是低耦合关系
    • 当在处理者中分配职责时,责任链给应用程序更多的灵活性
    • 应用程序可以动态的增加和删除处理者或重新指派处理者的职责
    • 应用程序可以动态的改变处理者的顺序
    • 用户不必知道处理者的信息

    责任链模式的应用场景

    Java Web中的过滤器链、Struts2中的拦截器栈。

  • 相关阅读:
    Permutation Test 置换检验
    计算机会议排名等级
    国际顶级计算机会议
    机器学习中的范数规则化 L0、L1与L2范数 核范数与规则项参数选择
    岭回归(Ridge Regression)
    popupWindow使用timePicker时点击出现闪屏问题的解决办法
    Java:单例模式的七种写法
    JSONObject遍历获取键值方法合并两个JSONObject
    解决android studio上“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65935”问题
    解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6762806.html
Copyright © 2020-2023  润新知