美文网首页
责任链模式

责任链模式

作者: andpy | 来源:发表于2018-01-31 11:06 被阅读9次

    责任链模式

    一个请求有多个对象来处理,这些对象是一条链,但具体的由那个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止.

    使用场景

    • 有多个对象可以处理同一请求,具体的那个对象处理该请求待运行时刻再确定.
    • 在不明确指定接收者的情况下,想多个对象中的一个提交一个请求.
    • 可动态指定一组对象的处理请求,客服端可以动态的创建职责链来处理请求.

    代码示例:
    Handler

    public abstract class Handler {
        private Handler nextHandler;
        //当前领导可以审批的最大天数
        public int maxDay;
        protected Handler(int maxDay){
            this.maxDay = maxDay;
        }
        //设置责任链中下一个处理请求的对象
        public void setNextHnader(Handler nextHandler){
            this.nextHandler = nextHandler;
        }
    
        protected void handlerRequest(int day){
            if (day<=maxDay){
                reply(day);
            }else {
                if (null !=nextHandler){
                    //权限不够继续向上报
                    nextHandler.handlerRequest(day);
                }else {
                    System.out.println("没有更高的领导审批了");
                }
            }
        }
    
        protected abstract void reply(int day);
    
    }
    

    Android/java中的实际运用

    • try-catch 语句
    • Ordered Broadcast 有序广播
    • ViewGroup/View 事件传递

    ViewGroup/View事件分发

    • MotionEvent: 实际上就是对该Event的分发

      • ACTION_DOWN /ACTION_MOVE /ACTION_UP
    • dispathcTouchEvent: 事件分发,view有相关的事件操作时,会调用该方法,true消费该事件,false 继续分发。

    • onInterceptTouchEvent: 存在于ViewGroup中,View中没有该方法,是否拦截该事件,拦截之后,就不会向下传递.

    • onTouchEvent: 该方式是被 dispatchTouchEvent方法调用的,具体的处理当前view的逻辑的,为true本身处理,为false父类处理.

    VieGroup的事件分发

    • ViewGroup的事件分发流程
      • 判断自身是否需要,调用 onInterceptTouchEvent,需要的话 返回true,就调用 自身的 onTouchEnvent(),
      • 自身不需要或者不确定,则询问ChildView
      • 如果ChileView 不需要则调用自身的 onTouchEvent()。

    在 dispathcTouchEvent 中:


    viewGroup.png

    ViewGroup中可能存在多个ChildView,如何判断应该分配给哪一个?

    把所有的子view遍历一遍,判断手指按住(事件触发的位置)的位置,就可以确定分配给那一个view.

    当该点的childView有重叠是应该如何分配?

    一般会分配给现在最上层的View(具体的得区分情况,跟android渲染机制有关系)

    View为啥会有dispatchTouchEvent方法?

    • view 可以注册的很多的事件监听器,长按事件,点击事件,触摸事件等,需要统一的管理.

    view的四个相关方法调用顺序?

    • onClickListener
    • onLongClickListener
    • onTouchListener
    • onTouchEvent(自身view)
      四个事件的调用顺序为: onTouchListener > onTouchEvent > onLongClickListener >onClickListener

    相关文章

      网友评论

          本文标题:责任链模式

          本文链接:https://www.haomeiwen.com/subject/njskzxtx.html