zoukankan      html  css  js  c++  java
  • 设计模式 -- 责任链模式或者叫职责链模式(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表演节目
  • 相关阅读:
    splay复杂度的证明
    splay的写法
    洛谷 P3722 [AH2017/HNOI2017]影魔
    洛谷 P4770 [NOI2018]你的名字
    清北考前刷题day3下午好
    P3043 [USACO12JAN]牛联盟Bovine Alliance(并查集)
    bzoj3252攻略(线段树+dfs序)
    清北考前刷题day2早安
    清北考前刷题day2下午好
    清北考前刷题day1下午好
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/5042037.html
Copyright © 2011-2022 走看看