最简puremvc
工程如下,看来sendNotification是像comand和mediator发消息的
package { import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; public class Main extends Sprite { public var txt:TextField; public var btn:MyButton; public function Main() { if(stage) init(); else addEventListener(Event.ADDED_TO_STAGE,init); } private function init(e:Event=null):void { this.removeEventListener(Event.ADDED_TO_STAGE,init); txt = new TextField(); txt.text = "hellopuremvc"; this.addChild(txt); btn = new MyButton(); btn.y = 90; this.addChild(btn) MyFacade.getInstance().startup(this); } } }
package { import controller.MyCommand; import org.puremvc.as3.interfaces.IFacade; import org.puremvc.as3.patterns.facade.Facade; public class MyFacade extends Facade implements IFacade { public static const STARTUP:String = "startup"; public static const CHANGETEXT:String = "changetext"; public static const CHANGECOMMAND:String = "changecommand"; public function MyFacade() { } public static function getInstance():MyFacade { if(instance == null){ instance = new MyFacade(); } return instance as MyFacade; } override protected function initializeController():void { super.initializeController(); registerCommand(STARTUP,MyCommand); } public function startup(_main:Main):void { //启动puremvc环境 sendNotification(STARTUP,_main); } } }
package controller { import org.puremvc.as3.interfaces.INotification; import org.puremvc.as3.patterns.command.SimpleCommand; public class ChangeCommand extends SimpleCommand { public function ChangeCommand() { super(); } override public function execute(note:INotification):void{ trace("ChangeCommand执行了"); } } }
package controller { import model.MyProxy; import org.puremvc.as3.interfaces.INotification; import org.puremvc.as3.patterns.command.SimpleCommand; import view.BtnMediator; import view.TextMediator; public class MyCommand extends SimpleCommand { public function MyCommand() { super(); } override public function execute(note:INotification):void { var _main:Main = note.getBody() as Main; this.facade.registerProxy(new MyProxy()); this.facade.registerMediator(new TextMediator(_main.txt)); this.facade.registerMediator(new BtnMediator(_main.btn)); this.facade.registerCommand(MyFacade.CHANGECOMMAND,ChangeCommand); } } }
package model { import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.URLLoader; import flash.net.URLRequest; import org.puremvc.as3.interfaces.IProxy; import org.puremvc.as3.patterns.proxy.Proxy; public class MyProxy extends Proxy implements IProxy { public static const NAME:String = "MyProxy"; public function MyProxy(proxyName:String = null,data:Object = null) { super(NAME,data); 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); this.setData(xml); } private function onError(e:IOErrorEvent):void { trace("数据获取失败"); } } }
package view { import flash.display.SimpleButton; import flash.events.MouseEvent; import org.puremvc.as3.interfaces.IMediator; import org.puremvc.as3.patterns.mediator.Mediator; public class BtnMediator extends Mediator implements IMediator { public static const NAME:String = "BtnMediator"; public function BtnMediator(viewComponent:SimpleButton) { super(NAME,viewComponent); btn.addEventListener(MouseEvent.CLICK,onClick); } private function onClick(evt:MouseEvent):void { sendNotification(MyFacade.CHANGETEXT); sendNotification(MyFacade.CHANGECOMMAND); //sendNotification 看来是给command和mediator发消息的 } public function get btn():SimpleButton { return viewComponent as SimpleButton; } } }
package view { import flash.text.TextField; import model.MyProxy; import org.puremvc.as3.interfaces.IMediator; import org.puremvc.as3.interfaces.INotification; import org.puremvc.as3.patterns.mediator.Mediator; public class TextMediator extends Mediator implements IMediator { public static const NAME:String = "TextMediator"; public function TextMediator(viewComponent:TextField) { super(NAME,viewComponent); } override public function listNotificationInterests():Array { return [MyFacade.CHANGETEXT,MyFacade.CHANGECOMMAND];//对MyFacade.CHANGETEXT感兴趣 } override public function handleNotification(note:INotification):void { switch(note.getName()){ case MyFacade.CHANGETEXT: var proxy:MyProxy = facade.retrieveProxy(MyProxy.NAME) as MyProxy; var xml:XML = XML(proxy.getData()); txt.text = xml.msg; break; case MyFacade.CHANGECOMMAND: trace("mediator侦听command的命令也执行了"); break; } } public function get txt():TextField { return viewComponent as TextField; } } }