`
zhouxuebao87
  • 浏览: 116271 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex 框架PureMVC 源码解析之--View篇

    博客分类:
  • flex
 
阅读更多
Actionscript代码 复制代码 收藏代码
  1.   
  2. /*   
  3.  PureMVC - Copyright(c) 2006-08 Futurescale, Inc., Some rights reserved.   
  4.  Your reuse is governed by the Creative Commons Attribution 3.0 United States License   
  5. */   
  6. package org.puremvc.as3.core   
  7. {   
  8.   
  9.     import org.puremvc.as3.interfaces.*;   
  10.     import org.puremvc.as3.patterns.observer.Observer;   
  11.   
  12.     // 中介名称-中介 列表   
  13.     protected var mediatorMap : Array;   
  14.        
  15.     // 消息名称-观察者列表   
  16.     protected var observerMap   : Array;   
  17.        
  18.     // 单例的view   
  19.     protected static var instance   : IView;   
  20.        
  21.     // 出错消息   
  22.     protected const SINGLETON_MSG   : String = "View Singleton already constructed!";   
  23.        
  24.   
  25.     public class View implements IView   
  26.     {   
  27.            
  28.         /**   
  29.          *  构造函数,并构造相应的map   
  30.          *    
  31.          *    
  32.          * @throws Error    
  33.          *    
  34.          */   
  35.         public function View( )   
  36.         {   
  37.             if (instance != null) throw Error(SINGLETON_MSG);   
  38.             instance = this;   
  39.             mediatorMap = new Array();   
  40.             observerMap = new Array();     
  41.             initializeView();      
  42.         }   
  43.            
  44.         /**   
  45.          * 初始化view,由构造函数自动调用,   
  46.          * 在子类中可以通过此函数初始化view而不用覆盖构造函数   
  47.          *    
  48.          * @return void   
  49.          */   
  50.         protected function initializeView(  ) : void    
  51.         {   
  52.         }   
  53.        
  54.         /**   
  55.          *  单例view的工厂方法   
  56.          *    
  57.          * @return 返回单例view   
  58.          */   
  59.         public static function getInstance() : IView    
  60.         {   
  61.             if ( instance == null ) instance = new View( );   
  62.             return instance;   
  63.         }   
  64.                    
  65.         /**   
  66.          *  作用:注册观察者   
  67.          *         //对一个消息可能存在多个观察者   
  68.          * @param notificationName 消息名称   
  69.          * @param observer 要注册的观察者   
  70.          */   
  71.         public function registerObserver ( notificationName:String, observer:IObserver ) : void   
  72.         {   
  73.                
  74.             //得到该消息对应的所有观察者,如果不为空,就把这个观察者加进去,如若为空就初始化   
  75.             var observers:Array = observerMap[ notificationName ];   
  76.             if( observers ) {   
  77.                 observers.push( observer );   
  78.             } else {   
  79.                 observerMap[ notificationName ] = [ observer ];    
  80.             }   
  81.         }   
  82.   
  83.         /**   
  84.          *    
  85.          * 作用:通知所有的观察者了   
  86.          *      
  87.          *    
  88.          * @param notification 要通知观察者的消息   
  89.          */   
  90.         public function notifyObservers( notification:INotification ) : void   
  91.         {   
  92.             if( observerMap[ notification.getName() ] != null ) {   
  93.                    
  94.                 //获取该消息的所有对应观察者   
  95.                 var observers_ref:Array = observerMap[ notification.getName() ] as Array;   
  96.   
  97.                 //这有点迷糊完全可以这样写,原因是因为在循环的时候observers可能发生变化   
  98.                 /**   
  99.                  *                 
  100.                  *      for(var i:Number = 0;i<observers_ref.length;i++)   
  101.                  *      {   
  102.                  *          observer = observers_ref[i] as IObserver;   
  103.                  *          observer.notifyObserver(notification);   
  104.                  *      }   
  105.                  *   
  106.                  *    
  107.                  * */   
  108.   
  109.                 var observers:Array = new Array();    
  110.                 var observer:IObserver;   
  111.                 for (var i:Number = 0; i < observers_ref.length; i++) {    
  112.                     observer = observers_ref[ i ] as IObserver;   
  113.                     observers.push( observer );   
  114.                 }   
  115.                    
  116.                 // Notify Observers from the working array                 
  117.                 for (i = 0; i < observers.length; i++) {   
  118.                     observer = observers[ i ] as IObserver;   
  119.                     observer.notifyObserver( notification );   
  120.                 }   
  121.             }   
  122.         }   
  123.   
  124.         /**   
  125.          *  作用:根据给定的消息名和对消息感兴趣的对象移除观察者   
  126.          *        //上面提到一个消息名称可能对于多个观察者,所以必须使用第二个参数进一步确定   
  127.          * @param notificationName  消息名称   
  128.          * @param notifyContext 对消息感兴趣的对象   
  129.          */   
  130.         public function removeObserver( notificationName:String, notifyContext:Object ):void   
  131.         {   
  132.             // the observer list for the notification under inspection   
  133.             var observers:Array = observerMap[ notificationName ] as Array;   
  134.   
  135.             // find the observer for the notifyContext   
  136.             for ( var i:int=0; i<observers.length; i++ )    
  137.             {   
  138.                 if ( Observer(observers[i]).compareNotifyContext( notifyContext ) == true ) {   
  139.   
  140.                     observers.splice(i,1);   
  141.                     break;   
  142.                 }   
  143.             }   
  144.   
  145.             if ( observers.length == 0 ) {   
  146.                 delete observerMap[ notificationName ];        
  147.             }   
  148.         }    
  149.   
  150.         /**   
  151.          *  作用:注册中介   
  152.          * @param mediator 要注册的中介实例   
  153.          */   
  154.         public function registerMediator( mediator:IMediator ) : void   
  155.         {   
  156.             //保证以中介名称为key的对象在mediatorMap中唯一   
  157.             if ( mediatorMap[ mediator.getMediatorName() ] != null ) return;   
  158.                
  159.             // 根据名称注册该Mediator   
  160.             mediatorMap[ mediator.getMediatorName() ] = mediator;   
  161.                
  162.             // 得到所以该Mediator感兴趣的消息   
  163.             var interests:Array = mediator.listNotificationInterests();   
  164.   
  165.             // 其实说白了是把Mediator感兴趣的消息都注册成观察者,以便得到通知   
  166.             if ( interests.length > 0 )    
  167.             {   
  168.                 var observer:Observer = new Observer( mediator.handleNotification, mediator );   
  169.   
  170.                 for ( var i:Number=0;  i<interests.length; i++ ) {   
  171.                     registerObserver( interests[i],  observer );   
  172.                 }              
  173.             }   
  174.                
  175.             mediator.onRegister();   
  176.                
  177.         }   
  178.   
  179.         /**   
  180.          *  作用:根据中介名称获取中介   
  181.          *    
  182.          * @param mediatorName 要获取中介名称   
  183.          * @return    
  184.          */   
  185.         public function retrieveMediator( mediatorName:String ) : IMediator   
  186.         {   
  187.             return mediatorMap[ mediatorName ];   
  188.         }   
  189.   
  190.         /**   
  191.          *  作用:从view中移除中介   
  192.          *    
  193.          * @param mediatorName 要移除的中介名称   
  194.          * @return    
  195.          */   
  196.         public function removeMediator( mediatorName:String ) : IMediator   
  197.         {   
  198.             // 先拿到该中介   
  199.             var mediator:IMediator = mediatorMap[ mediatorName ] as IMediator;   
  200.                
  201.             if ( mediator )    
  202.             {   
  203.                 // 根据感兴趣的消息移除观察者   
  204.                 var interests:Array = mediator.listNotificationInterests();   
  205.                 for ( var i:Number=0; i<interests.length; i++ )    
  206.                 {   
  207.   
  208.                     removeObserver( interests[i], mediator );   
  209.                 }      
  210.                    
  211.                 // 移除中介   
  212.                 delete mediatorMap[ mediatorName ];   
  213.        
  214.                 // alert the mediator that it has been removed   
  215.                 mediator.onRemove();   
  216.             }   
  217.                
  218.             return mediator;   
  219.         }   
  220.            
  221.         /**   
  222.          *  作用:根据名称判断是否存在该中介   
  223.          *    
  224.          * @param mediatorName 中介名称   
  225.          * @return    
  226.          */   
  227.         public function hasMediator( mediatorName:String ) : Boolean   
  228.         {   
  229.             return mediatorMap[ mediatorName ] != null;   
  230.         }   
  231.   
  232.   
  233.     }   
  234. }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics