zoukankan      html  css  js  c++  java
  • 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

    本地查看效果实例:

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

  • 相关阅读:
    json web token 入门
    Mysql查询表注释和字段注释信息
    Nginx核心知识100讲学习笔记(陶辉):目录
    Kubernetes进阶实战读书笔记:网络存储
    Kubernetes进阶实战读书笔记:持久化存储卷(pv详解)
    Kubernetes进阶实战读书笔记:存储卷概述
    sybase
    Delphi 解决StrToDateTime()不是有效日期类型的问题
    delphi TStringList 用法详解
    看看Delphi中的列表(List)和泛型
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/2334442.html
Copyright © 2011-2022 走看看