责任链模式
一个请求有多个对象来处理,这些对象是一条链,但具体的由那个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止.
使用场景
- 有多个对象可以处理同一请求,具体的那个对象处理该请求待运行时刻再确定.
- 在不明确指定接收者的情况下,想多个对象中的一个提交一个请求.
- 可动态指定一组对象的处理请求,客服端可以动态的创建职责链来处理请求.
代码示例:
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
网友评论