`
emavaj
  • 浏览: 50180 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

打造 自己的 Flex MVC 框架

    博客分类:
  • Flex
阅读更多

以前用Cairngorm框架的时候,颇为惊讶,居然只有十几K的大小

难道很简单?

 

用了一段时间后,发现,其实做个MVC框架并不是很难(难在完善与通用)

 

自己也想搞点积累,就试着做了起来,打算搞个自己的MVC框架

 

要做这个首先要明白MVC是什么

M(模型):说白了,就是存储数据,操作数据的地方

V(视图):就是视图,负责呈现,数据绑定等

C(控制器):连接视图和模型的地方,在Flex中,就是做事件转发和监听增加的

 

除了上面的,还需要知道, 用了MVC会达到什么效果

 

简单的说,就是让数据存储,和数据操作 跟 视图呈现分离开

也就是让Module或者Application中,持有仅可能少的代码,把代码都放到AS类中

 

好,废话到这,下面是代码:

C层,控制器层:

package com.emavaj.mvc.control{
	import mx.core.Application;

	/**.
	 * 命令控制者,即为控制层MV(C)
	 */
	public class Controlor{
		/**增加监听.*/
		public static function addCommand(event:String, clazz:Class):void {
			/**clazz类是实现了com.emavaj.mvc.Command接口的类.*/
			var temp:Object = new clazz();
			/**将模型层接口中的doCommand方法加入监听.*/
			if (temp.hasOwnProperty("doCommand")) {
				var fun:Function = temp["doCommand"];
				Application.application.addEventListener(event,fun);
			} else {
				throw Error("增加监听:" + event + ",失败!");
			}
		}
		
		/**增加监听,具体到函数.*/
		public static function addCommandWithFunction(event:String, clazz:Class, fun:String):void {
			var temp:Object = new clazz();
			if (temp.hasOwnProperty(fun)) {
				var theFunction:Function = temp[fun];
				Application.application.addEventListener(event,theFunction);
			} else {
				throw Error("增加监听:" + event + ",失败!");
			}
		}
	}
}

 我的思路是模仿Cairngorm框架的,

就是把

addEventListener

 

这个函数封装一次,把参数,从 事件标识 + 函数

改为了 事件标识 + 类

好处就是,让监听该事件的函数,不仅仅是监听函数调用的类的函数而已

比如:

主应用程序中调用增加监听Event.ADDED事件,那么对这个事件的响应函数,必须是主应用程序中的函数

(当然,如果你像上面那么做反射的话,也可以。其实我就是封装了一次)

 

下面是M层,模型层:

package com.emavaj.mvc.command{
	/**.
	 * 命令执行接口
	 */
	public interface ICommand{
		/**执行命令方法.*/
		function doCommand(event:*):void;
	}
}

 

 这层,我仅提供了一个接口

也就是为 控制层服务的,当我再控制层利用反射 取得该类的函数时

我默认就制定 模型层中的接口 doCommand 方法为执行函数

(当然,我上面也提供了一个类中任意函数监听的方法)

 

也就是所,充当数据处理的AS类,只有实现ICommand接口,然后完成这个函数,就可以在增加监听的时候

传入处理类的类名

事件发生时,就会直接执行到doCommand方法

从而实现了逻辑的分离

 

下面是V层,视图层

package com.emavaj.mvc.view{
	import mx.core.Application;
	import mx.modules.ModuleLoader;

	/**.
	 * 视图工具
	 */
	public class ViewUtil{
		/**单例对象.*/
		private static var viewUtil:ViewUtil;
		
		/**获取ModuelLoader.*/
		public static function getModuleLoader(Id:String):ModuleLoader {
			var app:Object = Application.application;
			if (app.hasOwnProperty(Id)) {
				var property:ModuleLoader = app[Id];
				return property;
			} else {
				throw Error("取得ModuleLoader失败,该应用程序没有ID为:" + Id + "的ModuleLoader");
			}
		}
		
		/**获取Moduel.*/
		public static function getModule(Id:String):Object {
			var app:Object = Application.application;
			if (app.hasOwnProperty(Id)) {
				var property:ModuleLoader = app[Id];
				return property.child;
			} else {
				throw Error("取得Module失败,该应用程序没有ID为:" + Id + "的ModuleLoader");
			}
		}
		
		/**获取组件,获取任意视图base中的视图Id组件.*/
		public static function getView(base:Object, Id:String):Object {
			if (base.hasOwnProperty(Id)) {
				var property:Object = base[Id];
				return property;
			} else {
				throw new Error("取得组件失败," + base + "视图中没有" + Id + "组件");
			}
		}
	}
}

 

 

明显看到,视图层和控制层都是伪类

视图层提供数据呈现的当然是控件或.MXML文件

 

这里的视图层只提供了视图的查找

也就是说,你使用ViewUtil中的静态方法

就可以在 程序很任意地方,AS类,或者任意Module,来获得任意视图、Module的引用

从而操作视图变化!

 

至此,MVC已经完成

 

同时我也提供了一些简单的服务获取

package com.emavaj.mvc.util{
	import mx.core.Application;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.RemoteObject;

	/**.
	 * 远程服务对象工具类
	 */
	public class RemoteUtil{
		
		/**取得远程调用对象.*/
		public static function getRemoteById(Id:String):RemoteObject {
			return Application.application[Id];
		}
		
		/**组成调用监听方法.*/
		public static function addListener(remote:RemoteObject, success:Function, fault:Function):void {
			remote.addEventListener(ResultEvent.RESULT, success);
			remote.addEventListener(FaultEvent.FAULT, fault);
		}
		
		/**移除调用监听.*/
		public static function removeListener(remote:RemoteObject, success:Function, fault:Function):void {
			remote.removeEventListener(ResultEvent.RESULT, success);
			remote.removeEventListener(FaultEvent.FAULT, fault);
		}
	}
}

 

 

写出了一些Remote的常用方法,获取RemoteObject引用,增加监听,异常监听等

虽属于MVC范畴,但是作为框架,必定少不了

 

如果有什么意见或建议,欢迎留言,讨论

附件有源码和SWC文件

(SWC在源码的bin目录下,可以直接使用)

1
1
分享到:
评论
2 楼 qq123zhz 2010-06-18  
qq123zhz@gmail.com,拜托mail个使用的例子给我。。。
1 楼 qq123zhz 2010-06-18  
如何使用该MVC的例子,有不?

相关推荐

    spring-flex-1.0.1.RELEASE

    Spring Flex 将 Spring MVC 模型与 Flex 应用程序中的数据模型进行绑定,通过 BlazeDS 或 LCDS 实现 AMF 通信。 三、Spring Flex 组件结构 1. `flex-messaging-spring`:这是 Spring Flex 的核心模块,它包含 ...

    OrchestraDesigner概要设计

    综上所述,OrchestraDesigner概要设计文档详细阐述了系统的整体架构和关键组件,为开发团队提供了全面的设计指导,同时也展示了如何有效地利用Flex技术及其MVC框架,实现一个功能强大且用户体验优秀的在线工作流编辑...

    构建全栈式Flex、BlazeDS和Spring集成解决方案

    这样的集成解决方案能够充分利用Flex的前端优势,BlazeDS的数据传输效率以及Spring的后端服务管理能力,打造出高性能、用户体验良好的Web应用。对于需要构建复杂交互和实时数据更新的项目,这种全栈式解决方案尤其...

    郑岩峰,幻想Flex3,源代码4

    《郑岩峰,幻想Flex3,源代码4》是一份重要的IT学习资源,...通过郑岩峰的专业指导和实际的源代码练习,无论是新手还是有一定经验的开发者,都能从中获益匪浅,提升自己的Flex3开发能力,打造出富有吸引力的Web界面。

    flex3+java 的一个留言本的例子

    通过Servlet或Spring MVC等框架,Java将处理这些请求并返回相应的JSON或XML数据,供Flex解析展示。此外,Java还可以连接数据库,如MySQL或Oracle,实现数据的持久化存储,确保留言信息的安全和可靠性。 具体实现上...

    C#+FLEX留言版基于Fluorine

    本文将详细探讨如何利用C#后端技术和Flex前端技术,通过FluorineFX作为通信桥梁,打造一个高效稳定的C#+FLEX留言版。 首先,我们要理解C#和Flex的基本概念。C#是一种面向对象的编程语言,广泛应用于.NET Framework...

    Flex+Java多文件上传

    在Java后端,我们可以使用诸如Spring MVC、Struts2等Web框架来接收和处理这些文件数据。Java的Servlet API提供了HttpServletRequest对象,其中的getParts()方法可以用于接收多部分表单数据,即上传的文件。文件内容...

    WebGame的AS端开发心得

    3. **MVC框架**:熟悉并能够灵活运用MVC或其他类似框架,如Flex框架中的PureMVC。 4. **项目管理能力**:具备一定的项目管理和团队领导能力,能够有效地安排工作计划,协调团队成员间的合作。 5. **技术研究精神**:...

    SilverLightViewer开发人员指南.doc

    Flex是Adobe推出的RIA开发框架,主要基于ActionScript和Flash Player。尽管两者都致力于创建动态、交互性强的Web应用,但Silverlight有其独特优势。Silverlight支持.NET Framework,使得C#、VB.NET等编程语言的...

    sphex framework-开源

    使用者可以通过解压这个文件,按照提供的文档和示例代码,学习如何在自己的项目中部署和使用Sphex框架。 总的来说,Sphex Framework是一个优秀的开源选择,它结合了AMF的高效通信和Doctrine ORM的强大数据处理能力...

    构建和谐的Web2.0社区系列课程\构建和谐的Web2.0社区系列课程(6)

    常见的RIA框架和技术包括Adobe Flash、Flex,Microsoft Silverlight,以及JavaScript库如Ajax和现在的AngularJS、ReactJS等。在本课程中,我们将重点关注如何使用这些技术构建Fego城市,这是一个模拟现实世界的虚拟...

Global site tag (gtag.js) - Google Analytics