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

http://bbs.9ria.com/viewthread.php?tid=78580&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000

俺是新手,但老板让俺总结的给别的同事看,刚写好,趁热让兄弟们帮俺纠错。需要的也可以看下。估计代码会乱,需要的可以下载附件里面是word文档。

一.        首先写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.        如果继承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。

你可能感兴趣的:(PHP,脚本,Flex,bbs)