`

PureMVC学习笔记二:用FlashDevelop架设简单的MVC机制

阅读更多

 

PureMVC提供24个类(和接口),极大地简化了MVC机制的代码量。

很多类如Facade,SimpleCommand都是现成的,可以不继承就直接使用。

作为模型的Proxy可以不用。

最麻烦的是定制作为视图的Mediator类,但只需覆盖

override public function listNotificationInterests():Array 

override public function handleNotification(n:INotification):void 

这两个方法即可接收命令。

另外,PureMVC允许在Command类和Mediator类中拦截命令。

也就是说,PureMVC既可以实现发布-订阅模式(解耦接收方和发送方),

也可以实现前端控制器模式(对所有通知进行过滤和拦截,然后再转发)

 

用FlashDevelop可以这样操作(仅供参考):

(注:由于下面使用了trace函数,需要debug版的flash player独立程序或浏览器插件。

see

http://www.adobe.com/support/flashplayer/downloads.html

 

1. 下载AS3标准版swc文件

http://trac.puremvc.org/PureMVC_AS3/wiki/Downloads

 

2. 用FD创建一个ActionScript3 Flex 4 Project工程testmvc,

右键->Edit->Delete删除src下的Main.mxml。

 

3. 把swc文件复制到工程树的lib目录下,

然后右键->Add To Library添加到classpath中

 

4. src上右键->Add->New Class...添加一个类。

Name填Main,Base Class->Browse填Sprite(自动寻找)

 

5. 用类似的方法创建四个类,自动生成代码的头部是:

public class MyFacade extends Facade implements IFacade

public class MyCommand extends SimpleCommand implements ICommand

public class MyProxy extends Proxy implements IProxy

public class MyMediator extends Mediator implements IMediator

如果不记得,可以展开swc文件,查看里面带I开头的接口类。

不含IModel, IView和IControl,因为它们已经在Facade里面。

还有一种办法,就是展开swc文件,双击org.puremvc.as3.interfaces.IFacade,

查看IFacade中带register开头的函数:

public function registerCommand (param0:String, param1:Class) : void;

public function registerMediator (param0:IMediator) : void;

public function registerProxy (param0:IProxy) : void;

 

6. 为了编译,先在Main类中创建PureMVC核心。

方便起见,让它可以用文档类名直接访问。

 

public class Main extends Sprite
{
	public static var fac:MyFacade = new MyFacade();
	
	public function Main() 
	{
		
	}
}

 

然后选中Main.as右键->Always Compile。

当Main.as变成绿色后,按工具栏上的编译按钮。

 

7. 到此为止除FD自动生成的内容外,

只写了一句代码,所以很容易就编译通过。

展开生成的bin/testmvc.swf,发现里面除了puremvc的类外,

只有Main和MyFacade两个类。

需要进一步编译其它类。

 

8. 打开MyFacade.as,在构造函数中创建和注册其余的所有类,

然后创建相应的命令常量:

 

 

public class MyFacade extends Facade implements IFacade
{
	public static const MY_COMMAND:String = "mycommand";
	
	public function MyFacade() 
	{
		this.registerCommand(MY_COMMAND, MyCommand);
		this.registerMediator(new MyMediator());
		this.registerProxy(new MyProxy());
	}
}

 

 

为什么命令类的注册方式与众不同呢?

那是因为命令类实例通常由PureMVC的机制自动生成,而不是由程序员手工创建

 

9. 按工具栏上的编译按钮,编译通过

注意导入Proxy类是import org.puremvc.as3.patterns.proxy.Proxy。

如果导入的是flash.utils.Proxy,编译会出错。

 

10. 现在,可以在任何地方发送命令给facade,

然后让facade把这个命令发给中介类MyMediator。

中介的意思是,它的方法不允许直接被外部的类调用(虽然它有public方法):

 

11. 在点击舞台时发送命令MY_COMMAND(它已经被注册绑定到MyCommand),

附带一个字符串"onClick"(它的引用被一起发到接收方)

 

 

public class Main extends Sprite
{
	public static var fac:MyFacade = new MyFacade();
	
	public function Main() 
	{
		this.stage.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);
	}
	
	private function onClick(e:MouseEvent):void 
	{
		Main.fac.sendNotification(MyFacade.MY_COMMAND, "onClick");
	}
}

 

 

12. 然后想办法拦截这个MyFacade.MY_COMMAND命令。

方法是,覆盖中介类的listNotificationInterests和handleNotification方法。

注意:

(1) 需要导入INotification接口。

(2) getName是方法,不是属性,需要加括号

(3) 如果listNotificationInterests方法没有覆盖,handleNotification将无效

 

 

package  
{
	import org.puremvc.as3.interfaces.IMediator;
	import org.puremvc.as3.patterns.mediator.Mediator;
	
	import org.puremvc.as3.interfaces.INotification;
	
	/**
	 * ...
	 * @author 
	 */
	public class MyMediator extends Mediator implements IMediator
	{
		public function MyMediator() 
		{
			
		}
		
        override public function listNotificationInterests():Array 
        {
            return [MyFacade.MY_COMMAND];
        }
		
        override public function handleNotification(n:INotification):void 
        {
            switch (n.getName()) 
			{
				case MyFacade.MY_COMMAND:
					trace(n.getBody() as String);
					break;
            }
        }
	}
}

 

 

编译后运行,发现每当鼠标点击舞台,都会产生内容为onClick的调试输出。

 

13. 另一种拦截方法是覆盖命令类的execute方法:

 

 

package  
{
	import org.puremvc.as3.interfaces.ICommand;
	import org.puremvc.as3.patterns.command.SimpleCommand;
	
	import org.puremvc.as3.interfaces.INotification;
	
	/**
	 * ...
	 * @author 
	 */
	public class MyCommand extends SimpleCommand implements ICommand
	{
		
		public function MyCommand() 
		{
			
		}
		
		override public function execute(n:INotification):void    
		{
			trace("execute:" + n.getBody() as String);
		}
	}
}

 

 

它不需要switch,也比handleNotification先执行。

 

14. 现在已经体验了四个类的作用:

Main对象用于界面和实例创建

MyFacade对象用于注册实例,定义命令常量和发送命令。

MyCommand类用于命令发送时的拦截(用于无目标视图的通知)。

MyMediator类用于命令接收时的拦截(用于有目标视图的通知)。

 

15. 代理类对象的生命周期比命令类长。

通常用于存储网络接收的数据。

也可用于在中介之间共享状态(在通知发送之前修改),

这样一来就能避免使用单实例模式。

在基类的构造函数中指定名称和绑定数据的初始值。

 

 

package
{
	//import flash.utils.Proxy
	import org.puremvc.as3.patterns.proxy.Proxy;
	import org.puremvc.as3.interfaces.IProxy;
	
	/**
	 * ...
	 * @author 
	 */
	public class MyProxy extends Proxy implements IProxy
	{
		public function MyProxy() 
		{
			super("myproxy", 0);
		}
	}
}

 

 

然后在命令发送前改变它(通过名称取出引用)。

 

 

 

package  
{
	import org.puremvc.as3.interfaces.ICommand;
	import org.puremvc.as3.interfaces.IProxy;
	import org.puremvc.as3.patterns.command.SimpleCommand;
	
	import org.puremvc.as3.interfaces.INotification;
	
	/**
	 * ...
	 * @author 
	 */
	public class MyCommand extends SimpleCommand implements ICommand
	{
		
		public function MyCommand() 
		{
			
		}
		
		override public function execute(n:INotification):void    
		{
			var proxy:IProxy = this.facade.retrieveProxy("myproxy");
			proxy.setData(proxy.getData() + 1);
			trace("execute:" + n.getBody() as String);
		}
	}
}

 

然后在命令接收后读出来:

 

 

package  
{
	import org.puremvc.as3.interfaces.IMediator;
	import org.puremvc.as3.patterns.mediator.Mediator;
	
	import org.puremvc.as3.interfaces.INotification;
	
	/**
	 * ...
	 * @author 
	 */
	public class MyMediator extends Mediator implements IMediator
	{
		public function MyMediator() 
		{
			
		}
		
        override public function listNotificationInterests():Array 
        {
            return [MyFacade.MY_COMMAND];
        }
		
        override public function handleNotification(n:INotification):void 
        {
            switch (n.getName()) 
			{
				case MyFacade.MY_COMMAND:
					trace(n.getBody() as String);
					trace("proxy data:" + this.facade.retrieveProxy("myproxy").getData());
					break;
            }
        }
	}
}

 

 

因为getData()和setData()的代码灵活性不够高,

可以在MyProxy中定义新的属性,

再用类似的方法保存状态。

 
 
分享到:
评论

相关推荐

    [转] 老板让俺总结的puremvc学习笔记

    4. **通知(Notifications)**:PureMVC使用Notification对象作为通信机制,使得模型、视图和控制器之间的通信变得简单而统一。Notification包含类型、名称和可选的数据,可以通过Facade发送并被任何注册的Observer...

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

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

    PureMVC 中文版

    标题 "PureMVC 中文版" 指的是 PureMVC 框架的一个中文版本,这是一款广泛应用的开源框架,特别设计用于构建富互联网应用程序(RIA),尤其是基于Adobe Flex和ActionScript 3的项目。PureMVC 提供了一种模块化、结构...

    [转] PureMVC心得教程:使用puremvc框架实现的贪吃蛇

    PureMVC是一个轻量级的、跨平台的MVC(模型-视图-控制器)框架,主要用于构建可维护性和扩展性高的应用。本教程将基于PureMVC框架讲解如何实现一个经典的“贪吃蛇”游戏,以此来深入理解PureMVC的核心概念和工作流程...

    PureMVC中文教程

    标题中的“PureMVC中文教程”表明这是一份关于PureMVC框架的中文学习资料,主要面向想要理解和掌握这一框架的开发者。PureMVC是一个开源的、轻量级的、跨平台的MVC(Model-View-Controller)设计模式框架,它提供了...

    pureMVC资料包

    在PureMVC资料包中,`puremvc_swf.swc`可能是一个已经编译好的PureMVC库,可以直接在Flash或Flex项目中导入使用。它提供了所有必要的类和接口,如MacroCommand、SimpleCommand、Mediator、Proxy、Notifier等,这些都...

    PureMVC框架学习总结

    下面将详细介绍PureMVC框架及其消息发送机制。 首先,MVC设计模式是一种软件开发范式,它通过将应用程序分为三个主要的组件来降低程序复杂性,提高系统的可维护性和可扩展性。其中,Model是指数据模型,它负责表示...

    PureMVC学习资料与案例

    4. **通知(Notifications)**:PureMVC使用一种称为Notification的机制来实现各层间的通信。通知是一种无类型的事件,可以被任何层发布,并被其他任何层监听。这种方式使得组件间解耦,便于扩展和维护。 5. **宏...

    puremvc 最新版本2.0.4源码

    PureMVC AS3 Standard Framework是针对ActionScript 3开发者的版本,ActionScript 3是一种广泛用于创建富互联网应用程序(RIA),特别是Adobe Flash平台的语言。在这个版本2.0.4中,我们可以期待PureMVC为AS3开发者...

    PureMVC C#框架

    10. **学习曲线**:PureMVC的简单API和清晰的架构使得开发者能够快速上手,同时也有助于团队成员间的协作和代码审查。 在"puremvc-csharp-standard-framework-master"这个压缩包中,你将找到PureMVC C#标准版的源...

    可以运行的puremvc的登陆实例.

    标题中的“可以运行的PureMVC的登陆实例”是指一个基于PureMVC框架的登录功能实现,这个实例已经经过验证可以在FlexBuilder3环境下正常运行。PureMVC是一种经典的多层应用架构模式,它为ActionScript、JavaScript、...

    PureMVC_study

    【PureMVC学习指南】 PureMVC是一款轻量级的框架,主要应用于Flex和AS3开发,它基于...PureMVC_Study这个压缩包文件可能是对PureMVC框架的实例演示或者学习资料,可以帮助开发者进一步了解和掌握PureMVC的使用方法。

    PureMvc实例 PureMvc第一个实例

    在这个名为"MyFirstPureMvc"的压缩包中,你将找到一个使用PureMvc开发的Adobe AIR项目的完整实例,这将帮助初学者理解如何在实际项目中应用PureMvc。 首先,让我们深入了解一下PureMvc的MVC架构: 1. **模型...

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

    6. **Hello World示例**:通常会通过一个简单的“Hello World”程序来演示PureMVC的基本工作流程,展示如何创建并运行一个完整的MVC循环。 7. **源码分析**:可能对PureMVC的源码进行解析,帮助理解其内部机制和...

    PureMVC.zip

    学习和使用PureMVC,开发者可以更好地理解和实践MVC模式,提升Unity项目的专业性和可维护性。同时,由于PureMVC具有跨平台的特性,这意味着你在Unity中的代码可以应用于其他支持PureMVC的平台,如Flash、Java等。

    pureMVC 源码

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

    Lua实现PureMVC

    若是想使用,可以直接查看网上的pureMVC 文档,我并未对任何一个函数改名或者更换参数位置。 注意,这个PureMVC中的 class(ClassName, BaseName) 函数并不提供,因为此框架本意就是为了用于cocos2d-x-lua中。

    PureMVC的例子

    标题中的“PureMVC的例子”指的是一个使用PureMVC框架的示例项目,这是一款轻量级的、基于观察者模式的多层架构设计模式框架,适用于ActionScript 3.0、Flex、Java、Swift等多种编程语言。PureMVC旨在简化开发流程,...

    PureMVC简单例子

    这个“PureMVC简单例子”是为了帮助初学者理解PureMVC框架的基本原理和实际操作流程。在这个例子中,我们将深入探讨各层的职责以及它们之间的通信机制。 首先,我们来了解一下MVC模式。MVC模式是一种软件设计模式,...

    一个很好的puremvc实例

    通过深入研究这些文件,我们可以学习到如何在实际项目中使用PureMVC,例如: - 如何定义和组织PureMVC的模型类,以处理应用程序的数据和状态。 - 如何创建和注册中介者,以监听视图组件的事件并响应用户操作。 - ...

Global site tag (gtag.js) - Google Analytics