以前用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目录下,可以直接使用)
分享到:
相关推荐
Spring Flex 将 Spring MVC 模型与 Flex 应用程序中的数据模型进行绑定,通过 BlazeDS 或 LCDS 实现 AMF 通信。 三、Spring Flex 组件结构 1. `flex-messaging-spring`:这是 Spring Flex 的核心模块,它包含 ...
综上所述,OrchestraDesigner概要设计文档详细阐述了系统的整体架构和关键组件,为开发团队提供了全面的设计指导,同时也展示了如何有效地利用Flex技术及其MVC框架,实现一个功能强大且用户体验优秀的在线工作流编辑...
这样的集成解决方案能够充分利用Flex的前端优势,BlazeDS的数据传输效率以及Spring的后端服务管理能力,打造出高性能、用户体验良好的Web应用。对于需要构建复杂交互和实时数据更新的项目,这种全栈式解决方案尤其...
《郑岩峰,幻想Flex3,源代码4》是一份重要的IT学习资源,...通过郑岩峰的专业指导和实际的源代码练习,无论是新手还是有一定经验的开发者,都能从中获益匪浅,提升自己的Flex3开发能力,打造出富有吸引力的Web界面。
通过Servlet或Spring MVC等框架,Java将处理这些请求并返回相应的JSON或XML数据,供Flex解析展示。此外,Java还可以连接数据库,如MySQL或Oracle,实现数据的持久化存储,确保留言信息的安全和可靠性。 具体实现上...
本文将详细探讨如何利用C#后端技术和Flex前端技术,通过FluorineFX作为通信桥梁,打造一个高效稳定的C#+FLEX留言版。 首先,我们要理解C#和Flex的基本概念。C#是一种面向对象的编程语言,广泛应用于.NET Framework...
在Java后端,我们可以使用诸如Spring MVC、Struts2等Web框架来接收和处理这些文件数据。Java的Servlet API提供了HttpServletRequest对象,其中的getParts()方法可以用于接收多部分表单数据,即上传的文件。文件内容...
3. **MVC框架**:熟悉并能够灵活运用MVC或其他类似框架,如Flex框架中的PureMVC。 4. **项目管理能力**:具备一定的项目管理和团队领导能力,能够有效地安排工作计划,协调团队成员间的合作。 5. **技术研究精神**:...
Flex是Adobe推出的RIA开发框架,主要基于ActionScript和Flash Player。尽管两者都致力于创建动态、交互性强的Web应用,但Silverlight有其独特优势。Silverlight支持.NET Framework,使得C#、VB.NET等编程语言的...
使用者可以通过解压这个文件,按照提供的文档和示例代码,学习如何在自己的项目中部署和使用Sphex框架。 总的来说,Sphex Framework是一个优秀的开源选择,它结合了AMF的高效通信和Doctrine ORM的强大数据处理能力...
常见的RIA框架和技术包括Adobe Flash、Flex,Microsoft Silverlight,以及JavaScript库如Ajax和现在的AngularJS、ReactJS等。在本课程中,我们将重点关注如何使用这些技术构建Fego城市,这是一个模拟现实世界的虚拟...