01-16-14 责任链模式 - View事件分发的责任链机制

张开发
2026/4/19 10:55:52 15 分钟阅读

分享文章

01-16-14 责任链模式 - View事件分发的责任链机制
01-16-14 责任链模式 - View事件分发的责任链机制责任链模式是什么将请求沿着处理者链传递直到有对象处理它为止。Android源码中的责任链实现View事件分发链// ActivitypublicbooleandispatchTouchEvent(MotionEventev){if(getWindow().superDispatchTouchEvent(ev)){returntrue;// 事件被消费}returnonTouchEvent(ev);// 传递给Activity}// ViewGrouppublicbooleandispatchTouchEvent(MotionEventev){booleanhandledfalse;// 1. 拦截检查finalbooleanintercepted;if(actionMaskedMotionEvent.ACTION_DOWN||mFirstTouchTarget!null){finalbooleandisallowIntercept(mGroupFlagsFLAG_DISALLOW_INTERCEPT)!0;if(!disallowIntercept){interceptedonInterceptTouchEvent(ev);// 询问是否拦截}else{interceptedfalse;}}else{interceptedtrue;}// 2. 分发给子Viewif(!intercepted){for(intichildrenCount-1;i0;i--){if(dispatchTransformedTouchEvent(ev,false,child,idBitsToAssign)){handledtrue;break;}}}// 3. 自己处理if(!handled){handledsuper.dispatchTouchEvent(ev);}returnhandled;}// ViewpublicbooleandispatchTouchEvent(MotionEventevent){if(onFilterTouchEventForSecurity(event)){if(mOnTouchListener!nullmOnTouchListener.onTouch(this,event)){returntrue;// OnTouchListener消费事件}if(onTouchEvent(event)){returntrue;// onTouchEvent消费事件}}returnfalse;}事件流Activity.dispatchTouchEvent() ↓ ViewGroup.dispatchTouchEvent() ↓ (如果不拦截) 子ViewGroup.dispatchTouchEvent() ↓ View.dispatchTouchEvent() ↓ View.onTouchEvent() ↓ (如果不消费) 父ViewGroup.onTouchEvent() ↓ Activity.onTouchEvent()使用示例// 自定义ViewGroup拦截滑动classCustomViewGroup:LinearLayout{overridefunonInterceptTouchEvent(ev:MotionEvent):Boolean{returnwhen(ev.action){MotionEvent.ACTION_MOVE-{// 水平滑动时拦截事件abs(ev.x-lastX)abs(ev.y-lastY)}else-false}}}实战应用场景1请求处理链// 处理器接口interfaceRequestHandler{varnext:RequestHandler?funhandle(request:Request):Response?}// 抽象处理器abstractclassAbstractHandler:RequestHandler{overridevarnext:RequestHandler?nulloverridefunhandle(request:Request):Response?{valresponsedoHandle(request)returnresponse?:next?.handle(request)}protectedabstractfundoHandle(request:Request):Response?}// 具体处理器1认证classAuthHandler:AbstractHandler(){overridefundoHandle(request:Request):Response?{if(request.token.isEmpty()){returnResponse(401,Unauthorized)}returnnull// 继续传递}}// 具体处理器2权限classPermissionHandler:AbstractHandler(){overridefundoHandle(request:Request):Response?{if(!request.hasPermission()){returnResponse(403,Forbidden)}returnnull}}// 具体处理器3业务逻辑classBusinessHandler:AbstractHandler(){overridefundoHandle(request:Request):Response?{returnResponse(200,Success)}}// 构建责任链valchainAuthHandler().apply{nextPermissionHandler().apply{nextBusinessHandler()}}// 处理请求valresponsechain.handle(request)场景2日志过滤链enumclassLogLevel{DEBUG,INFO,WARN,ERROR}abstractclassLogger(vallevel:LogLevel){varnext:Logger?nullfunlog(message:String,level:LogLevel){if(this.levellevel){write(message)}next?.log(message,level)}protectedabstractfunwrite(message:String)}classConsoleLogger:Logger(LogLevel.DEBUG){overridefunwrite(message:String){println([Console]$message)}}classFileLogger:Logger(LogLevel.WARN){overridefunwrite(message:String){// 写入文件println([File]$message)}}classRemoteLogger:Logger(LogLevel.ERROR){overridefunwrite(message:String){// 上报服务器println([Remote]$message)}}// 构建日志链valloggerConsoleLogger().apply{nextFileLogger().apply{nextRemoteLogger()}}// 使用logger.log(Debug message,LogLevel.DEBUG)// 只输出到Consolelogger.log(Warning message,LogLevel.WARN)// 输出到Console和Filelogger.log(Error message,LogLevel.ERROR)// 输出到所有总结核心思想请求沿着链传递每个处理者决定是否处理或传递解耦请求发送者和接收者Android中的应用View事件分发- 触摸事件传递链OkHttp拦截器- 网络请求拦截链Filter过滤器- Servlet请求过滤责任链模式的核心价值是动态组合处理逻辑提供灵活的请求处理机制。

更多文章