11.10设计模式-责任链模式-详解

设计模式-责任链模式

    1. 责任链模式详解
    1. 责任链模式在android的实际运用
11-8_11章结束[01_30_18][20180806-212950-9].jpg

1.责任链模式详解

1.概念
    是一个请求有多个对象处理,这些对象是一条链,但具体是哪个对象处理,根据条件判断确定,如果不能处理会传递给该链的下一个对象,直到有对象处理它为止
2.使用场景
    1.有多个对象可以处理同一个请求,但具体哪个对象处理该请求待运行时刻再确定。一个报告,给上级 ,上级处理不了继续 向上
    2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
    3.可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求
3.UML结构图分析
    图:
        
4.实际代码分析
    1.抽象父类:重点 1.属性nextHandler 2.方法handleRequest
        能自己处理就处理,不能处理让下一个处理者处理
        public abstract class Handler{
            private Handler nextHandler;
            public int maxDay;
            protected Handler(int maxDay){
                this.maxDay = maxDay;
            }
            public void setNextHandler(Handler handler){
                nextHandler = handler;
            }
            protected void handleRequest(int day){
                if(day <= maxDay){
                    reply(day);
                }else {
                    if(nextHandler !=null){
                        nextHandler.handleRequest(day);
                    }else{
                        System.out.println("没有更高的领导审批了");
                    }
                }
            }
            protected abstract void reply(int day);
        }
5.责任链设计模式优点

2.责任链模式在android的实际运用

1.try-catch 语句,如果有很多的catch语句,如果catch语句处理了,就不会向上传
2.Ordered Broadcast。 有序广播,如果ABC 都接收,A的优先级高,A先收
3.ViewGroup/View 事件传递
    1.主要概念
        MotionEvent
            MotionEvent:ACTION_DOWN
                        :ACTION_MOVE
                        :ACTION_UP
            事件分发机制三个重要方法
            1.dispatchTouchEvent
                当一个事件MotionEvent传递给当前View时,当前View就会调用该方法,这个方法返回值是boolean类型,返回结果表明是否消耗该事件,不会再向下传递。
                这个方法时责任链模式的开端
            2.onInterceptTouchEvent ;
                只在ViewGroup中,默认返回false。
            3.onTouchEvent方法, 会被dispatchTouchEvent调用
                
        上层的View 即可以拦截该事件,也可以询问子View是否要处理事件,子View需要可以自己处理,不需要可以继续交给上层处理,这样既保证了整体事件的有序性,有
    2.viewgroup的事件分发
        1.ViewGroup事件分发流程
            1.判断自身是否需要
            2.自身不需要或者不确定,则询问ChildView
            3.如果子Viwe 不需要则调用自身的onTouchEvent
        2.具体的代码
            
        3.两个小问题
            1.ViewGroup中可能有多个子View,如何判断应该分配给哪一个?    
                把所有的子View都遍历一遍,如果手指触摸的点在子View所在的区域 就分发给它。
            2.当该点的ChildView 有重叠是应该如何分配?
                一般分配给最上层的
    3.view的时间分发
        View为啥会有dispatchTouchEvent方法?
            View可以注册很多事件监听器
        view的四个相关方法
            a.单击事件(onClickListener)
            b.长按事件(onLongClickListener)
            c.触摸事件(onTouchListener)
            d.View自身处理(onTouchEvent)
                
        所以事件的调度顺序应该是 onTouchListener->onTouchEvent->onLongClickListener->onClickListener
        
        事件分发机制原理,责任链设计模式,事件层层传递,直到被消费
11-8_11章结束[01_30_18][20180806-212950-9].jpg
11-8_11章结束[01_31_16][20180806-213030-0].jpg
11-8_11章结束[01_38_39][20180806-214442-1].jpg
11-8_11章结束[01_41_57][20180806-214659-2].jpg

你可能感兴趣的:(11.10设计模式-责任链模式-详解)