puremvc框架之proxy

上一篇 puremvc框架之Command 里,已经学习了如何利用Command来解耦View层与业务逻辑的依赖,但是仍然有二个问题:

1、ButtonMediator中发送消息时,仍然采用硬编码的方式,将消息内容写死在代码中:

private function btnClick(e:MouseEvent):void{
			this.sendNotification(AppFacade.CHANGE_TEXT,"Hello PureMVC !");
		}

这显然不是一个好的设计,不够灵活

2、我们一直在说puremvc是一个mvc框架,至今为止 controller(即Command)、view(即Mediator)都已经出现过了,但是model层还是不见踪影,puremvc中的model层在哪里?

在asp.net mvc中,model层通常是定义数据实体的部分,可以选用的技术有很多,比如linq to sql,linq to entity ,nhibernate之类,这个概念在puremvc中仍然是相通的,只不过换了个名字,我们称之为Proxy!

先来定义一个AppProxy类吧(放到mvc.model包中),代码如下:

package mvc.model
{
	import org.puremvc.as3.interfaces.IProxy;
	import org.puremvc.as3.patterns.proxy.Proxy;
	import flash.events.IOErrorEvent;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;

	public class AppProxy extends Proxy implements IProxy
	{
		public static const NAME:String="AppProxy"; //名称常量

		public function AppProxy(proxyName:String=null, data:Object=null)
		{
			super(NAME, data);//将本proxy的名称常量传入其中
			var _loader:URLLoader=new URLLoader;
			_loader.addEventListener(Event.COMPLETE, onComplete);
			_loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
			_loader.load(new URLRequest("data.xml"));
		}

		private function onComplete(e:Event):void
		{

			var _xml:XML=XML(e.target.data);
			setData(_xml); //将xml内容保存进data
		}

		private function onError(e:IOErrorEvent):void
		{
			trace("数据获取失败!");
		}
	}
}

这里,我们用xml做为数据源来提供数据,data.xml放到根目录下,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<message>
        <msg>Hello World!</msg>
</message>

ok,这一步做好后,老问题又来了:如何让它跟puremvc环境中的facade实例挂上勾?类似上一篇的处理,还是放到AppCommand中来处理

package mvc.controller
{
	import mvc.AppFacade;
	import mvc.model.AppProxy;
	import mvc.view.ButtonMediator;
	import mvc.view.TextMediator;

	import org.puremvc.as3.interfaces.INotification;
	import org.puremvc.as3.patterns.command.SimpleCommand;

	public class AppCommand extends SimpleCommand
	{
		public function AppCommand()
		{
			super();
		}

		public override function execute(inote:INotification):void
		{
			var _main:main=inote.getBody() as main;

			//注册proxy
			facade.registerProxy(new AppProxy());

			facade.registerMediator(new TextMediator(_main.txtResult));
			facade.registerMediator(new ButtonMediator(_main.btnSend));			

			facade.registerCommand(AppFacade.CHANGE_TEXT,ChangeTextCommand);
		}
	}
}

注意加注释的部分facade.registerProxy(new AppProxy());这样就ok了,这一步执行后,puremvc环境中就已经有data.xml的数据了

现在就可以把原来ButtonMediator中硬编码的部分去掉了,改成下面这样:

private function btnClick(e:MouseEvent):void{
		//this.sendNotification(AppFacade.CHANGE_TEXT,"Hello PureMVC !");
		sendNotification(AppFacade.CHANGE_TEXT);
	}

即:view层只发送消息(类型),通知puvrmvc环境--“CHANGE_TEXT消息我已经发出去了!”,至于数据在哪,谁去处理,关我P事!

OK,有人发了消息,自动就要有人处理,接下来折腾ChangeTextCommand.as

public override function execute(notification:INotification):void{

			var _proxy:AppProxy=facade.retrieveProxy(AppProxy.NAME) as AppProxy;
			var _xml:XML=XML(_proxy.getData());
			trace(_xml);
			(facade.retrieveMediator(TextMediator.NAME) as TextMediator).txtInstance.text = _xml.msg;
			//(facade.retrieveMediator(TextMediator.NAME) as TextMediator).txtInstance.text = notification.getBody() as String;
		}

这里,我们把原来的方法注释掉了,改成用Proxy的getData获取刚才data.xml中的数据,然后该数据赋值为TextMediator相关联的文本框.

至此,M(proxy)-V(mediator)-C(command)全都登场了,相互之间也实现了完全解耦!

 

最后再从头回顾一下主要的处理细节:

1、man.mxml中通过 AppFacade.getInstance().startup(this) 启动puvemvc环境

2、而AppFacade又通过this.registerCommand(START_UP, AppCommand) 注册AppCommand

3、AppCommand中又通过

facade.registerProxy(new AppProxy());
facade.registerMediator(new TextMediator(_main.txtResult));
facade.registerMediator(new ButtonMediator(_main.btnSend));
facade.registerCommand(AppFacade.CHANGE_TEXT,ChangeTextCommand);

把mediator、proxy以及消息CHANGE_TEXT相关的ChangeTextCommand给扯进来

4、然后ButtonMediator中又通过sendNotification(AppFacade.CHANGE_TEXT)来发送自己感兴趣的消息

5、最后CHANGE_TEXT消息被与之关联的ChangeTextCommand得到,并在execute方法中处理以更新UI界面。

源文件下载:http://cid-2959920b8267aaca.office.live.com/self.aspx/flex/PureMVC^_Proxy.fxp (用FB4导入即可)

时间: 2024-11-05 14:56:55

puremvc框架之proxy的相关文章

puremvc框架之Command

在前一篇 puremvc框架之hello world! 里,已经对这个框架有了一个大概的认识,不过在消息的处理上,有一个不太适合的地方: 为了完成响应消息,TextMediator亲自去监听自己感兴趣的消息类型,然后亲自来处理.要知道:Mediator属于View层(即:MVC中的V),它最好是什么也不干,仅仅与界面保持联系即可,对于如何响应消息这类粗活,应该交由Controller层(即MVC中的C)来处理最适合不过,所以这一章介绍如何把消息处理由V(View)转移到C(Controller)

puremvc框架之hello world!

puremvc是一个可应用于多种语言.多种平台的mvc框架.根据官网上的描述,现在已经支持下列语言: 官方也推出了最佳实践的中文文档,当然,园子里也有兄弟说它烂的 :)   跟asp.net mvc框架有所不同,在asp.net mvc中,一个http请求过来,controller会自动去取得数据,最终转化为model,然后选取一个view进行呈现,同时把model传到view中,一切还算比较简单.   然而puremvc除mvc模式外,渗杂了更多的模式:比如facade(门面),observe

PureMVC(AS3)剖析:实例

PureMVC(AS3)剖析:实例 实例 上篇介绍了MVC的思维方式"代码重用(code reusability).关注点分离(separation of concerns,SoC)",并介绍了PureMVC框架的设计.本篇从一个实例出发,详细介绍PureMVC框架中的元素.推荐的项目目录组织方式.代码格式等等. 1.  PureMVC模块划分 上篇中介绍了PureMVC框架设计中存在的角色,这里先回顾一下:经典MVC元设计模式中的三部分由三个单例类管理,分别是Model .View和

PureMVC(AS3)剖析:设计模式(二)

PureMVC(AS3)剖析:设计模式(二) 模式 上一篇中介绍了PureMVC中使用的3种设计模式:单例模式.观察者模式.外观模式.本篇将继续介绍剩下的3种设计模式: l  使用中介者(Mediator)模式来封装UI与系统中其他对象的交互,使得各对象不需要显示地互相引用,从而使得其耦合松散,而且可以独立地改变它们之间的交互: l  使用代理(Proxy)模式为数据对象提供代理以控制数据对象的访问,PureMVC中Proxy负责操作数据模型,与远程服务信存取数据: l  使用命令(Comman

PureMVC(AS3)剖析:开篇

PureMVC(AS3)剖析:开篇 缘起 自从事flash webgame开发起,3个项目都使用到了MVC模式:1个自己构建的MVC没有使用外部框架:2个使用的PureMVC框架.对PureMVC也有了一定的深度的认识,是时候来总结.吐槽下.现在网上已经流传很多关于PureMVC的资源,但是总觉得深度不够,故有了现在这个系列,我尽量带着自己的思考深入的介绍PureMVC,同时也能引起大家的思考.这里我并不是一味的说PureMVC有多好,它也有值得质疑和使用不爽的地方. MVC思维 要了解Pure

PureMVC(AS3)剖析:设计模式(一)

PureMVC(AS3)剖析:设计模式(一) 模式 PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model.View和Controller.降低模块间的耦合性,各模块如何结合在一起工作对于创建易扩展,易维护的应用程序是非常重要的.PureMVC框架使用多重设计模式来实现解耦彻底.灵活性. l  单例(singleton)模式保证一个类仅有一个实例,并提供一个访问它的全局访问点.在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例类管理,分别是Model .View和Co

基于pureMVC的Swing程序的入门介绍

用过Flex的人都知道有个基于MVC的puremvc框架,这个框架因为小巧简单很受欢迎. PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model.View和Controller.降低模块间的耦合性,各模块如何结合在一起工作对于创建易扩展,易维护的应用程序是非常重要的.在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是 Model.View和Controller.三者合称为核心层或核心角色.PureMVC中还有另外一个单例模式类-Facade,Faca

flash PureMVC 使用例子_Flash as3

此例环境:flash cs3链接PureMVC类<编辑->首选参数->ActionScript->ActioScript 3.0 设置(加上你的下载的PureMVC类包), PureMVC下载地址>开始动手喽~1, 在flash里准备一下要显示层的东东: 此例就画了一个背景方框, 添加一个动态的TextField命名为txt, 然后绑定一个类AppTextField.as; AppTextField.as里需要接收一个字符串并显示出来, 些字符串数据就是来自于数据层的(后面有

C#版MVC框架PureMVC的深入分析和改良方案

在PureMVC中,通知(Notification)贯穿整个框架,把观察者模式发挥得淋漓尽致.MVC的三层通信都是通过Notification来通信.Notification由两部分组成:Name和Body.如果把Notification当作是邮件,那么Name就是收件人,不过在PureMVC中可以有多个观察者(Observer)接收相同的邮件,Body自然就是Notification的内容了.Notification和Observer的关系是1:N,这点可以从View层的代码中看出来. obs