• 设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))


    什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象。职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点。

    android中事件分发就是责任链模式的具体表现:

    View的ontouchEvent返回值设置,如果为true,交个自己的消费事件的方法去处理,如果为false,则继续向下一个进行传递。

    如何实现责任链模式:

    比如责任链上有,A,B,C三个对象,如果A有权限则自己处理,否则传递下去给B,B如果没有权限处理,则传递下去,C如果有权限处理,则处理,否则不处理。

    A中有判断的逻辑,一个是符合条件的,自己去处理,一个是不符合自身条件的,交给链条中的下一个对象去处理,B,C一次类推都是同样的道理。

    花鼓传花比赛,失败表演节目的例子来讲讲:

     首先创建责任链传递的抽象类:比如下面这个类:

    基类,封装处理handler()和指向下一个节点setNextHandler()的方法:

    public abstract class Handler {
        protected Handler handler;
        
        public Handler setNextHandler(Handler carHandler) {
            //根据参数指向下一个handler对象
            this.handler = carHandler;
            return this.handler;
        }
        
        //当前对象的实际操作
        public abstract void handler(); 
    }

    传花同学A:

    public class AHandler extends Handler {
        
        @Override
        public void handler() {
            System.out.println("A表演节目");
            if(this.handler != null){
                this.handler.handler();
            }
        }
    }

    传花同学B:

    public class BHandler extends Handler {
        
        @Override
        public void handler() {
            System.out.println("B表演节目");
            if(this.handler != null){
                this.handler.handler();
            }
        }
    }

    传花同学C:

    public class CHandler extends Handler {
        
        @Override
        public void handler() {
            System.out.println("C表演节目");
            if(this.handler != null){
                this.handler.handler();
            }
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            Handler aHandler = new AHandler();
            Handler bHandler = new BHandler();
            Handler cHandler = new CHandler();
    
            System.out.println("-------a==>b==>c--------");
            aHandler.setNextHandler(bHandler);
            bHandler.setNextHandler(cHandler);
            aHandler.handler();
            
            
            System.out.println("1-------b==>a==>c--------");
            bHandler.setNextHandler(aHandler);
            aHandler.setNextHandler(cHandler);
            bHandler.handler();
            
            System.out.println("2-------b==>a==>c--------");
            bHandler.setNextHandler(aHandler).setNextHandler(cHandler);
            bHandler.handler();
        }
        
    }

    测试结果:

    -------a==>b==>c--------
    A表演节目
    B表演节目
    C表演节目
    1-------b==>a==>c--------
    B表演节目
    A表演节目
    C表演节目
    2-------b==>a==>c--------
    B表演节目
    A表演节目
    C表演节目
  • 相关阅读:
    linux中systemctl详细理解及常用命令
    Hadoop中的java基本类型的序列化封装类
    理解javaBean
    hadoop之mr框架的源码理解注意点
    python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程
    Hadoop MapReduce执行过程详解(带hadoop例子)
    为什么hadoop中用到的序列化不是java的serilaziable接口去序列化而是使用Writable序列化框架
    Java代码如何关联Hadoop源码
    关于版本控制
    GIT和SVN之间的五个基本区别
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/5042037.html
Copyright © 2020-2023  润新知