• chainOfResponsibility责任链模式


    责任链(Chain of Responsibility)模式 :

      责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些处理对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。责任链模式强调的是每一个对象及其对下家的引用来组成一条链,利用这种方式将发送者和接收者解耦,类图如下:

    通过上图可以看出责任链模式有两个角色:
    抽象处理者(Handler)角色 :定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
    具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。
     
    代码演示:
     
    1.新建一个抽象处理角色,当然,它是一个abstract类,因为里面的处理方法要给每个具体角色类去扩展使用
    /**
     * 抽象处理角色
     * @author mlxs
     *
     */
    public abstract class Hander {
        
        /**
         * 处理角色 实例
         */
        protected Hander hander;
        
        /**
         * 抽象处理方法:执行处理
         */
        public abstract void doHander(String reqStr);
    
        public Hander getHander() {
            return hander;
        }
    
        public void setHander(Hander hander) {
            this.hander = hander;
        }
        
    }

    2.添加3个具体实现子类:HanderFirst,HanderSecond,HanderLast,并实现doHander方法

    /**
     * 具体处理角色
     * @author mlxs
     *
     */
    public class HanderFirst extends Hander {
    
        @Override
        public void doHander(String reqStr) {
            //得到当前处理角色
            Hander nowHander = getHander();
            //判断:如果是自己的责任,则处理,处理完后结束(return);否则,传给下一角色处理
            if(reqStr.equals("HanderFirst")){
                System.out.println("---Hander1 doHander()---");
                return;
            }else{
                //不是自己的责任,责任推给下家
                System.out.println("Hander1 pass --> next");
                nowHander.doHander(reqStr);
            }
        }
    }
    /**
     * 具体处理角色
     * @author mlxs
     *
     */
    public class HanderSecond extends Hander {
    
        @Override
        public void doHander(String reqStr) {
            //得到当前处理角色
            Hander nowHander = getHander();
            //判断:如果是自己的责任,则处理,处理完后结束(return);否则,传给下一角色处理
            if(reqStr.equals("HanderSecond")){
                System.out.println("---Hander2 doHander()---");
                return;
            }else{
                //不是自己的责任,责任推给下家
                System.out.println("Hander2 pass --> next");
                nowHander.doHander(reqStr);
            }
        }
    }
    /**
     * 具体处理角色
     * @author mlxs
     *
     */
    public class HanderLast extends Hander {
    
        @Override
        public void doHander(String reqStr) {
            //如果前面的都没处理,最后一家处理
            System.out.println("...
    ---HanderLast doHander()---");
        }
        
    }

    3.编写客户端请求类:Main

    public class Main {
        
        public static void main(String[] args) {
            
            //创建3个具体处理者
            Hander hander1 = new HanderFirst();
            Hander hander2 = new HanderSecond();
            Hander hander3 = new HanderLast();
            
            //3个处理者链接,形成责任链
            hander1.setHander(hander2);
            hander2.setHander(hander3);
            
            //从hander1开始处理请求
    //        hander1.doHander("HanderFirst");
    //        hander1.doHander("HanderSecond");
            hander1.doHander("hahahahh");
        }
    }

    4.运行,查看结果

    Hander1 pass --> next
    Hander2 pass --> next
    ...
    ---HanderLast doHander()---

    过滤器和拦截器,就是通过这种模式思想写的,,,

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    从Objective-C到Swift,你必须会的(四)DLog
    从Objective-C到Swift,你必须会的(三)init的顺序
    从Objective-C到Swift,你必须会的(二)组合options
    从Objective-C到Swift,你必须会的(一)#pragma mark
    swift的可选值(optional)
    一个通用的DataGridView导出Excel扩展方法(支持列数据格式化)
    C#定时执行一个操作
    用Dictionary替换switch case
    Web Service 通过BinaryFormatter序列化和反序列化泛型List
    开源.NET FTP组件edtFTPnet 用法
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5149560.html
Copyright © 2020-2023  润新知