`

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

    博客分类:
  • Flex
阅读更多


/*
 PureMVC - Copyright(c) 2006-08 Futurescale, Inc., Some rights reserved.
 Your reuse is governed by the Creative Commons Attribution 3.0 United States License
*/
package org.puremvc.as3.core
{

	import org.puremvc.as3.interfaces.*;
	import org.puremvc.as3.patterns.observer.Observer;

	// 中介名称-中介 列表
	protected var mediatorMap : Array;
	
	// 消息名称-观察者列表
	protected var observerMap	: Array;
	
	// 单例的view
	protected static var instance	: IView;
	
	// 出错消息
	protected const SINGLETON_MSG	: String = "View Singleton already constructed!";
	

	public class View implements IView
	{
		
		/**
		 *  构造函数,并构造相应的map
		 * 
		 * 
		 * @throws Error 
		 * 
		 */
		public function View( )
		{
			if (instance != null) throw Error(SINGLETON_MSG);
			instance = this;
			mediatorMap = new Array();
			observerMap = new Array();	
			initializeView();	
		}
		
		/**
		 * 初始化view,由构造函数自动调用,
		 * 在子类中可以通过此函数初始化view而不用覆盖构造函数
		 * 
		 * @return void
		 */
		protected function initializeView(  ) : void 
		{
		}
	
		/**
		 *  单例view的工厂方法
		 * 
		 * @return 返回单例view
		 */
		public static function getInstance() : IView 
		{
			if ( instance == null ) instance = new View( );
			return instance;
		}
				
		/**
		 *  作用:注册观察者
		 *         //对一个消息可能存在多个观察者
		 * @param notificationName 消息名称
		 * @param observer 要注册的观察者
		 */
		public function registerObserver ( notificationName:String, observer:IObserver ) : void
		{
			
			//得到该消息对应的所有观察者,如果不为空,就把这个观察者加进去,如若为空就初始化
			var observers:Array = observerMap[ notificationName ];
			if( observers ) {
				observers.push( observer );
			} else {
				observerMap[ notificationName ] = [ observer ];	
			}
		}

		/**
		 * 
		 * 作用:通知所有的观察者了
		 *   
		 * 
		 * @param notification 要通知观察者的消息
		 */
		public function notifyObservers( notification:INotification ) : void
		{
			if( observerMap[ notification.getName() ] != null ) {
				
				//获取该消息的所有对应观察者
				var observers_ref:Array = observerMap[ notification.getName() ] as Array;

				//这有点迷糊完全可以这样写,原因是因为在循环的时候observers可能发生变化
				/**
				 *				
				 *		for(var i:Number = 0;i<observers_ref.length;i++)
				 *		{
				 *			observer = observers_ref[i] as IObserver;
				 *			observer.notifyObserver(notification);
				 *		}
				 *
				 * 
				 * */

   				var observers:Array = new Array(); 
   				var observer:IObserver;
				for (var i:Number = 0; i < observers_ref.length; i++) { 
					observer = observers_ref[ i ] as IObserver;
					observers.push( observer );
				}
				
				// Notify Observers from the working array				
				for (i = 0; i < observers.length; i++) {
					observer = observers[ i ] as IObserver;
					observer.notifyObserver( notification );
				}
			}
		}

		/**
		 *  作用:根据给定的消息名和对消息感兴趣的对象移除观察者
		 *        //上面提到一个消息名称可能对于多个观察者,所以必须使用第二个参数进一步确定
		 * @param notificationName  消息名称
		 * @param notifyContext 对消息感兴趣的对象
		 */
		public function removeObserver( notificationName:String, notifyContext:Object ):void
		{
			// the observer list for the notification under inspection
			var observers:Array = observerMap[ notificationName ] as Array;

			// find the observer for the notifyContext
			for ( var i:int=0; i<observers.length; i++ ) 
			{
				if ( Observer(observers[i]).compareNotifyContext( notifyContext ) == true ) {

					observers.splice(i,1);
					break;
				}
			}

			if ( observers.length == 0 ) {
				delete observerMap[ notificationName ];		
			}
		} 

		/**
		 *  作用:注册中介
		 * @param mediator 要注册的中介实例
		 */
		public function registerMediator( mediator:IMediator ) : void
		{
			//保证以中介名称为key的对象在mediatorMap中唯一
			if ( mediatorMap[ mediator.getMediatorName() ] != null ) return;
			
			// 根据名称注册该Mediator
			mediatorMap[ mediator.getMediatorName() ] = mediator;
			
			// 得到所以该Mediator感兴趣的消息
			var interests:Array = mediator.listNotificationInterests();

			// 其实说白了是把Mediator感兴趣的消息都注册成观察者,以便得到通知
			if ( interests.length > 0 ) 
			{
				var observer:Observer = new Observer( mediator.handleNotification, mediator );

				for ( var i:Number=0;  i<interests.length; i++ ) {
					registerObserver( interests[i],  observer );
				}			
			}
			
			mediator.onRegister();
			
		}

		/**
		 *  作用:根据中介名称获取中介
		 * 
		 * @param mediatorName 要获取中介名称
		 * @return 
		 */
		public function retrieveMediator( mediatorName:String ) : IMediator
		{
			return mediatorMap[ mediatorName ];
		}

		/**
		 *  作用:从view中移除中介
		 * 
		 * @param mediatorName 要移除的中介名称
		 * @return 
		 */
		public function removeMediator( mediatorName:String ) : IMediator
		{
			// 先拿到该中介
			var mediator:IMediator = mediatorMap[ mediatorName ] as IMediator;
			
			if ( mediator ) 
			{
				// 根据感兴趣的消息移除观察者
				var interests:Array = mediator.listNotificationInterests();
				for ( var i:Number=0; i<interests.length; i++ ) 
				{

					removeObserver( interests[i], mediator );
				}	
				
				// 移除中介
				delete mediatorMap[ mediatorName ];
	
				// alert the mediator that it has been removed
				mediator.onRemove();
			}
			
			return mediator;
		}
		
		/**
		 *  作用:根据名称判断是否存在该中介
		 * 
		 * @param mediatorName 中介名称
		 * @return 
		 */
		public function hasMediator( mediatorName:String ) : Boolean
		{
			return mediatorMap[ mediatorName ] != null;
		}


	}
}
 
分享到:
评论

相关推荐

    puremvc-js-multicore-framework-master

    在本篇文章中,我们将深入探讨"puremvc-js-multicore-framework-master"这一项目,它代表了PureMVC在JavaScript中的多核实现。 1. **PureMVC简介** PureMVC是基于观察者模式的框架,它将应用程序分为三个主要部分...

    初探PureMVC:使用PHP+MySQL+Flex结合PureMVC框架做了个Flex留言本

    标题中的“初探PureMVC:使用PHP+MySQL+Flex结合PureMVC框架做了个Flex留言本”揭示了本文将探讨如何使用PureMVC框架,结合PHP后端和MySQL数据库,构建一个基于Flex的前端留言本应用。PureMVC是一个轻量级、可扩展的...

    puremvc源码分析

    PureMVC是一个轻量级的框架,用于构建模块化、可维护的JavaScript、ActionScript、Flex、Swift和Java应用程序。它的设计模式基于经典的MVC(Model-View-Controller)架构,但进行了强化和优化,使其更适合现代Web...

    pureMVC源码实例(flex的mvc框架)

    纯MVC(PureMVC)是一种设计模式,它在软件工程领域中被广泛用于构建多层架构的应用程序,特别是在富互联网应用程序(RIA)如Flex项目中。该模式将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器...

    FLEX资源--------PureMVC开发包下载

    **标题解析:** "FLEX资源--------Pure...综上所述,"FLEX资源--------PureMVC开发包下载"提供的内容是一个用于Flex开发的开源MVC框架,其源码可以用于学习和定制,配合相关教程和工具,有助于提升开发效率和代码质量。

    puremvc-as3-standard-framework-master

    PureMVC AS3 Standard Framework 是一个轻量级的、开源的、跨平台的模型-视图-控制器(MVC)框架,专为ActionScript 3(AS3)编程语言设计。该框架的主要目的是帮助开发人员按照MVC模式组织代码,提高开发效率,降低...

    PureMVC总结(附Hello World含PureMVC源码代码和文档)

    7. **源码分析**:可能对PureMVC的源码进行解析,帮助理解其内部机制和设计理念。 8. **文档阅读指南**:如何理解和使用提供的PureMVC官方文档,以获取更多关于框架的信息。 通过学习PureMVC,开发者可以获得一种...

    pureMVC 源码

    纯MVC(PureMVC)是一个轻量级的框架,用于构建基于模型-视图-控制器(Model-View-Controller)设计模式的应用程序。在AS3.0版本中,PureMVC提供了强大的组织和管理代码的方式,使得开发者可以更有效地进行多层应用...

    Flex puremvc 实例及说明(flex 4.6开发环境)

    Flex纯MVC(PureMVC)是一个开源的设计模式框架,专为富互联网应用程序(RIA)设计,特别是基于Adobe Flex和ActionScript的项目。在Flex 4.6开发环境中使用PureMVC,可以帮助开发者遵循经典的Model-View-Controller...

    Flex PureMVC手册

    PureMVC开发框架使用手册,PureMVC包含多个版本,这个文档是Flex版本 的MVC开发框架说明,

    puremvc-swift-standard-framework-master_demo

    标题 "puremvc-swift-standard-framework-master_demo" 指向的是一个使用 Swift 语言实现的 PureMVC 标准框架的示例项目。PureMVC 是一个轻量级的、跨平台的、开源的 Model-View-Controller (MVC) 框架,它为软件...

    flex pure mvc框架

    Flex Pure MVC框架是一种基于ActionScript 3.0的模型-视图-控制器(MVC)设计模式实现,专为Adobe Flex应用程序设计。Flex是用于构建富互联网应用(RIA)的开发平台,而Pure MVC则是帮助开发者组织和管理代码结构的...

    pureMVC框架源码

    PureMVC是一个轻量级的、可移植的、模型-视图-控制器(Model-View-Controller)框架,主要用于构建富互联网应用程序(Rich Internet Applications,RIA)。它在ActionScript 3(AS3)环境中得到了广泛的应用,同时也...

    Flex PureMVC页面跳转

    Flex PureMVC是一种基于Model-View-Controller(MVC)设计模式的轻量级框架,主要应用于Adobe Flex和ActionScript 3.0开发。在Flex应用程序中,页面跳转是用户体验的重要组成部分,PureMVC提供了优雅的方式来管理...

    Flex pureMVC 资料例子打包

    在这个“Flex pureMVC 资料例子打包”中,我们可以深入学习如何在Flex项目中应用PureMVC框架,从而更好地理解和实践这一强大的设计工具。 1. **PureMVC简介**:PureMVC是由MainFrame Software公司开发的一个开源...

    PureMVC框架实例

    PureMVC是一种轻量级、模型-视图-控制器(Model-View-Controller,MVC)框架,最初是为Flash/Flex应用设计的,但后来扩展到支持多种编程语言,包括JavaScript、Java、C#等。在Flex开发中,PureMVC因其强大的可维护性...

    Flex Java PureMVC BlazeDS做的例子

    说明: 前台--Flex 后台--Java (JPA,Spring) 前台框架--PureMVC Http协议--BlazeDS 做的例子,好东西,欢迎下载 可能很简单,但是内容很全,下一步加入Struts2.0

    puremvc 框架源码及教程, 附带一个使用示例

    PureMVC是一个轻量级的、跨平台的、基于观察者模式的多层应用程序架构框架。这个框架的主要目的是为了简化开发过程,提供一种模块化、结构化的开发方式,以提高代码的可重用性和可维护性。在本教程中,我们将深入...

Global site tag (gtag.js) - Google Analytics