fabrication的拦截器Interceptors简介

简介:

Interceptors(拦截器),主要目的是为了改变PureMVC的消息通知在到达Commands和Mediators的正常执行顺序。 在拦截器里可以:

·废弃notification不再向外广播

·修改notificationg再向外广播

·使用新的notification替换原有的notification

·无限制发送这一次notification

·Interceptors与commands类似,可以使用PureMVC实例访问和修改应用程序

依赖:

Fabrication V0.6+ 可使用此功能

Interceptors的注册

Interceptors使用registerInterceptor方法来进行的注册,该方法可在FabricationFacade或是SimpleFabricationCommand的子类中使用。

语法,registerInterceptor(noteName:String, clazz:Class, parameters:Object=null)

noteName:注册notification它的名称

clazz:拦截器的处理类

parameters:可选参数,供拦截器处理类使用

// registers the interceptor for the save notification name. registerInterceptor("save", MyInterceptor);

// registers the interceptor with save notification with extra parameters
registerInterceptor("save", MyInterceptor, {foo:"bar"});
Interceptors的实现
拦截类的处理类(前面提及的clazz),必须继承自AbstractInterceptor类,并实现intercept方法。
当注册的Notifications被发送时(使用sendNotification或是routerNotification方法进行发送),
拦截器会调用该处理类的intercept方法,这些方法中可以直接使用的对象有:
notification:被拦截的notification对象
parameters:拦截器注册时传入的可选参数
processor:对外提供的几种方法,忽略、跳过或中止该notification的广播,包含三个方法<proceed|abort|skip>
proceed:允许notification继续进行广播,可以使用新的notification替换当前的notification。
skip:如果所有对该notification的拦截器处理已经完成,就直接调用完成方法。不然就再调用该notification的其它拦截器实例
abort:直接中止该notification的广播,并立即调用完成方法。
在框架源码中可以看到上述三个方法中的实现:
1: public function getNotification():INotification {   2:     return notification;   3: }   4:     5: /**   6:  * Adds a interceptor to the list of interceptors for the current notification.   7:  *    8:  * @param interceptor The interceptor object to register.   9:  */  10: public function addInterceptor(interceptor:IInterceptor):void {  11:     interceptor.processor = this;              12:     interceptors.push(interceptor);  13: }  14:    15: /**  16:  * Removes the specified interceptor from the list of interceptors.  17:  *   18:  * @param interceptor The interceptor object to remove.  19:  */  20: public function removeInterceptor(interceptor:IInterceptor):void {  21:     var index:int = interceptors.indexOf(interceptor);  22:     if (index >= 0) {  23:         interceptors.splice(index, 1);  24:         interceptor.dispose();  25:     }  26: }  27:    28: /**  29:  * Runs all interceptors registered with this NotificationProcessor.  30:  */  31: public function run():void {  32:     var n:int = interceptors.length;  33:     var interceptor:IInterceptor;  34:     for (var i:int = 0; i < n; i++) {  35:         interceptor = interceptors[i];  36:           37:         interceptor.notification = notification;  38:         interceptor.intercept();  39:     }  40: }  41:    42: /**  43:  * Sends a proceed event so that the notification can be send to the rest of  44:  * the PureMVC actors. Flags this instance as complete to ignore other interceptors.  45:  * Also sends a finish event to indicate that the processor can be disposed.  46:  *   47:  * @param note The notification to proceed with. If null the current notification object is used.  48:  */  49: public function proceed(note:INotification = null):void {  50:     if (!finished) {  51:         dispatchEvent(new NotificationProcessorEvent(NotificationProcessorEvent.PROCEED, note));  52:         finish();  53:     }  54: }  55:    56: /**  57:  * Sends an abort event. Flags this instance as complete to ignore other interceptors.  58:  * Also sends a finish event to indicate that the processor can be disposed.  59:  */  60: public function abort():void {  61:     if (!finished) {  62:         dispatchEvent(new NotificationProcessorEvent(NotificationProcessorEvent.ABORT));  63:         finish();  64:     }  65: }  66:    67: /**  68:  * If all interceptors have been skipped then sends a finish event to indicate  69:  * that the processor can be disposed.  70:  */  71: public function skip():void {  72:     if (!finished && ++skipCount == interceptors.length) {  73:         finish();  74:     }  75: }  76:    77: /**  78:  * Flags the notification as finished and sends a finish event.  79:  */  80: public function finish():void {  81:     finished = true;  82:     dispatchEvent(new NotificationProcessorEvent(NotificationProcessorEvent.FINISH));  83: }

interceptor的处理过程是异步的,实例中对”save”这条消息进行了监听响应,也对“save”进行了拦截处理,但只有在点击“继续”按钮的时候才继续广播该notification。

英文原文(能力有限,本文翻译的可能有误,欢迎批评和斧正):http://code.google.com/p/fabrication/wiki/Interceptors#Requirements

示例demo的源码:http://code.google.com/p/fabrication/source/browse/examples/interceptor_demo/src#src%2Fmain%2Fflex%2Fcontroller%253Fstate%253Dclosed

本地查看效果实例:

如需要本示例程序的完整代码,立即下载>>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云API

腾讯云API:用Python使用腾讯云API(cvm实例)

腾讯云API地址:https://cloud.tencent.com/document/api

88740
来自专栏LanceToBigData

Hadoop(九)Hadoop IO之Compression和Codecs

前言   前面一篇介绍了Java怎么去查看数据块的相关信息和怎么去查看文件系统。我们只要知道怎么去查看就行了!接下来我分享的是Hadoop的I/O操作。   在...

29670
来自专栏jeremy的技术点滴

sed命令工作原理及命令备忘

36290
来自专栏重庆的技术分享区

在Apache反向代理的Linode上安装Jupyter Notebook Server

Jupyter Notebook是一个交互式增强型shell,可以在Web浏览器中运行。Notebook在数据科学家中很受欢迎,支持图形的在线渲染,导出为各种格...

29720
来自专栏岑玉海

hbase源码系列(六)HMaster启动过程

  这一章是server端开始的第一章,有兴趣的朋友先去看一下hbase的架构图,我专门从网上弄下来的。   按照HMaster的run方法的注释,我们可以了解...

64090
来自专栏大内老A

.NET Core的日志[5]:利用TraceSource写日志

从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针...

26260
来自专栏分布式系统进阶

ReplicaManager源码解析1-消息同步线程管理

基本上就是作三件事: 构造FetchRequest, 同步发送FetchRequest并接收FetchResponse, 处理FetchResponse, 这三...

18620
来自专栏程序员与猫

浅谈 EF CORE 迁移和实例化的几种方式

出于学习和测试的简单需要,使用 Console 来作为 EF CORE 的承载程序是最合适不过的。今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本...

26350
来自专栏信安之路

HCTF2017的三个WriteUp

解决方法就是先 undefine 掉函数,再右键选择 Code,最后 Create function 就可以正常反编译了。

13100
来自专栏熊二哥

快速入门系列--WebAPI--04在老版本MVC4下的调整

WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了。在之前的介绍中,基本上都基于.N...

25160

扫码关注云+社区

领取腾讯云代金券