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

news/2024/7/8 7:37:34

PureMVC总的流程是:
Façade通过一个STARTUP的Command来进行Proxy和Mediator的注册,初始化(这样Proxy和Mediator就可以接受Notification消息)。
Command通过Façade中注册的对应Notification触发。
Proxy只发送Notification(通知对应对象,数据已经变化或数据操作完毕)。
Mediator可以接受,发送和创建Notification。
Mediator通过Facade注册STARTUP的Command中传入的视图对象来操作视图。

一.首先写ApplicationFacade(约定俗成)继承Facade类
1.写一个单例方法用来获取它的对象,往后只通过这个方法获取它的对象:
其实也就只获取一次。
     public static function getInstance():ApplicationFacade{
           if(instance == null) instance = new ApplicationFacade();
          return instance as ApplicationFacade;
    }

2.写一个startup方法,里面有一个参数,通常这个参数是我们程序最外层的容器(FLEX里通常是Application,AS里就是Stage),里面也通常只有一句代码,用于启动我们的PureMVC。
                public function startup(app:Object):void{
                        sendNotification(STARTUP,app);
                }
备注:sendNotification(STARTUP,app)这就是发送消息,消息名STARTUP是这个消息名称,他是个字符串常量,app是消息的内容,其实消息还有第三个属性是个字符串,他是消息的类型。PureMVC会帮助我们把这三个东西封装成一个消息对象:
Notification( name:String, body:Object=null, type:String=null );
所以我们看到只有消息的名称是必须的,其他都为空。
3.重写 initializeController()方法,通过名字我们就知道他用来初始化control里的东西。记得执行父类的initializeController()的这个方法。
       override protected function initializeController():void{
                 super.initializeController();
               registerCommand(STARTUP,StartupCommand);
       }
备注:registerCommand(STARTUP,StartupCommand); STARTUP是我们定义的字符串常量,StartupCommand是我们定义的一个CLASS,将来我们想执行StartupCommand只需要发送消息名为STARTUP这个地消息,上面的备注已经讲到了怎么去发送消息。当我们执行sendNotification(STARTUP,app);这时pureMVC会自动去找到StartupCommand。
二. StartupCommand就是我们control层的东西了,下面我们来看看control层的东西,control层通需要继承下面两个类之一。我们都用StartupCommand举例
1. 如果继承SimpleCommand,这个类比较简单我们只要重写execute方法,当我们发送STARTUP命令时,PureMVC就会带着我们的消息内容一起来执行这个方法。
override public function execute(notification:INotification):void{
}
备注:notification参数就是我们前讲到的消息,他有三个参数,我们通过notification.getName()可以获取消息名,notification.getBody()可获取消息内容,
notification.getType()可获取消息的类型。
如果是刚开始学习2.可以先忽略
2. 如果继承MacroCommand,这个类我也不大懂,官网上说它里面的执行顺序是先进先出的原则,我们先不管这些,直接看怎么去用。也是需要重写initializeMacroCommand方法。当我们发送STARTUP命令时,PureMVC就会带着我们的消息内容一起来执行这个方法。但这个方法是没有参数的。但他真的没参数么?
override protected function initializeMacroCommand():void{
                addSubCommand(ModelPrepCommand);
addSubCommand(ViewPrepCommand);
}
备注:我们要记住这里面通常会调用addSubCommand()这个方法,这个方法也是有个CLASS类型的参数的,好现在我来回答上面提到地问题,真没参数么,其实是真的,但是PureMVC会给我们自动的把我们发送过来的消息传给ModelPrepCommand,ViewPrepCommand,为什么会这样呢,我的理解是可能这两个都需要执行同一个消息,但是他们有顺序要求,比如启动的时候我们需要一个界面,但显示的界面可能需要一些model层的数据,通常我们要先准备好数据再去显示这些数据,所以我们就有一个顺序了。initializeMacroCommand的先进先出原则也就这么体现出来了。先加进去的就会先被执行。加进去就是用addSubCommand()方法。
三. Control讲完了,我们来讲Model吧,谁让先进先出呢,我们也遵循这个原则,Model是最
简单的了,因为他不会接收消息,只会发送消息。Model层只需要继承Proxy这个类,他没要重写的方法,我们现在只关心他的构造方法。
public static const NAME:String = "XXX";
public function XXXProxy()
{
super(NAME, new XML())  ;
//父类是这样Proxy( proxyName:String=null, data:Object=null )
}
备注:我们这里相当于只执行父类的构造方法,第一个属性是名字,一个静态常量,我们要为我们的XXXProxy()起个名字,这个名字是为方便我们调用的(如果你希望他被别人调用那这个名字是必须的),怎么调用稍后讲,第二个是我们的数据类型,其实我认为这个不是什么时我觉得我们需要先把View层扔一边,来讲讲注册的事了,刚才我们讲了注册command,也就是我们Control层的东西,还记得么?,就是registerCommand(STARTUP,StartupCommand)好了自己复习去吧,我们现在要讲的是PureMVC里的三层里的东西是都需要注册的,好上面提到的Model层怎么注册呢。
1.注册model层的东东。
facade.registerProxy(new XXXProxy());
备注:这就注册成功了,就这么简单。但我们为什么注册他呢,还有我们刚才为什么要给XXXProxy()起个名字呢,这个就是做个登记,将来我找起来就方便了。好讲怎么找吧,façade这个东西你可以在任何地方找到,但注册的位置在哪,什么时候注册就需要揣摩了,注册Proxy应该是放在Control层Conmmand里。
2.找model层的东东。
facade.retrieveProxy(XXXProxy.NAME) as XXXProxy;
备注:这就找到了,得到了我们注册时的对象,我们就可以直接访问XXXProxy里面的东西了。
3. 要不我们直接讲讲注册view的东西吧,因为都一样,你也可以待会回头看这部分内容。
facade.registerMediator(new XXXMediator(app));
备注:是不是感觉一样呢,差不多但不一样的就是我们这里有个参数app,app是我们之前讲过的(satge或者application),也就是视图的东西,可以是一个图片,一个按钮的引用等等。
4. 查找view的东西,反正我暂时也没用到查找这个功能,但这个功能确实是存在的。和找model层的东西一样。
facade.retrieveMediator(XXXMediator.NAME)
备注:不多解释,因为view层的东西也都有个字符串的静态的常量的名字。
五.好终于来到View层了,View层我认为应该是功能最强大的,它可以直接访问Model(虽然不推荐),它可以完成任何Control里的功能。为什么呢?我也不知道,我们待会看例子理解。View层的东西都需要继承Mediator这个类,我们需要给他起个名字,和Model里的名字一样。还需要重写listNotificationInterests方法和handleNotification方法。
public static const NAME:String = "xxx";
public function XXXMediator(viewComponent:Object)
{
                        super(NAME, viewComponent);
}
override public function handleNotification(notification:INotification):void{
}
override public function listNotificationInterests():Array{
}
备注:构造方法里的viewComponent就是之前注册传过来的app或这图片啊,按钮啊的引用,这里我们就可以直接控制这些显示的东西了,我们可以在XXXMediator里直接用viewComponent这个属性。其实viewComponent可以不仅仅是一个显示控件,也可以是一个显示控件的数组。好,先看listNotificationInterests():array这个方法,他返回一个数组,一个什么数组呢,就是这个mediator所关注的消息,他可以关注很多消息,所以返回一个数组。handleNotification这个方法是干嘛用的呢,还记得command里的execute方法么,这里是一样的,看到了吧,他可以几乎可以干command里所有的事,而且还关注好多消息,command里只能一个,说明了什么呢,这就说明,Control里的command的功能要尽可能单一,增加可重用性。好了三层到此结束。
六.结束了还讲,如果你没发现问题那只能说明你不是一个好学生,我们全文上下提到好多次app,你尽然一点疑问都没有,难道PureMVC智能到可以知道我们写的程序的stage,application在哪,可以直接给我们添加上么。那必须不是啊,所以要我们手动添加,因为太简单,直接上代码吧。
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                                           xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" initialize="_facade.startup(this);”>

<fx:Script>
                <![CDATA[
                        private var _facade:ApplicationFacade = ApplicationFacade.getInstance();
                ]]>
</fx:Script>
备注:看到那个this了吧,指的就是我们的WindowedApplication因为是基于客户端的例子所以是这个。脚本里用我们最开始的单例获取了ApplicationFacade他的对象,并调用了startup方法,并传了个this过去,也就是我们的之前讲的app。

 


http://www.niftyadmin.cn/n/4036198.html

相关文章

函数的参数设置

函数的参数设置 默认参数 def power(x, n2):s 1while n > 0:n n - 1s s * xreturn s有几点要注意&#xff1a; 一是必选参数在前&#xff0c;默认参数在后&#xff0c;否则Python的解释器会报错&#xff08;思考一下为什么默认参数不能放在必选参数前面&#xff09;&…

Flash ActionScript (15) as2.0与as3.0区别

学习AS3.0已有一段时间了&#xff0c;想把自已对AS3的一些认识和大家分享一下。主要想说说AS3与AS2的不同之处&#xff0c;没有什么逻辑性&#xff0c;想到什么就写点什么&#xff0c;因此&#xff0c;它不适合AS高手们阅读。本文将力求用最直白的语言&#xff0c;尽量不用那些…

5G时代的材料新宠——液晶高分子聚合物

液晶高分子聚合物时80年代初期发展起来的一种新型高性能工程塑料&#xff0c;英文名为&#xff1a;Liquid Crystal Polymer 简称为LCP。 聚合方法以熔融缩聚为主&#xff0c;全芳香族LCP多辅以固相缩聚以制得高分子量产品。非全芳香族LCP常采用一步或二步熔融聚合制取产品。近年…

Flash/Flex学习笔记(1):Hello World!

万世开头难&#xff0c;先来一个Hello World!吧&#xff0c;Adobe出了二款支持Action Script3语言的经典开发工具&#xff0c;即:Flash CS 与Flash Builder(以前称为Flex Builder)&#xff0c;这二者的关系就好Silverlight中的Blend与Visual Studio 先来看看Flash中如何玩&…

java-mysql类型对照

java mysql 数据类型对照 类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述 VARCHARLNVARCHARjava.lang.String12 CHARNCHARjava.lang.String1 BLOBLNBLOBjava.lang.byte[]-4 TEXT65535VARCHARjava.lang.String-1 INTEGER4INTEGER UNSIGNEDjava.lang.Long4…

cisco交换机命令

交换机口令设置&#xff1a; switch>enable 进入特权模式 switch#config terminal 进入全局配置模式 switch&#xff08;config&#xff09;#hostname 设置交换机的主机名 switch&#xff08;config&#xff09;#enable secret xxx 设置特权加密口令 switch&#xff08;conf…

【半平面交】【计算几何】[BZOJ1038][ZJOI2008]瞭望塔

题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi&#xff0c;决定在村中建立一个瞭望塔&#xff0c;以此加强村中的治安。我们将H村抽象为一维的轮廓。如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), (x2, y2), …. (xn, yn)来描述H村的形状&#xff0c;这里x1 &l…

9种增强WordPress安全性的方法

对于WordPress博客的数据&#xff0c;有这么一句话&#xff1a;不是WordPress博客数据不重要&#xff0c;是没尝过丢失的滋味。有些朋友可能有这种经历&#xff1a;访问一个站的时候&#xff0c;会出现提示&#xff1a;This site may harm your computer&#xff08;这个网站可…