初学PureMVC
学习flex编程也有快两年时间,一直以来都没有过多深入了解框架方面的内容。最近项目上没什么工作,恰好有大块时间来学习,提升个人能力。为什么选择框架呢,是因为觉得作为一个开发人员,而且工作两年多的程序猿,不知道框架为何物,说不过去。为什么首选puremvc呢,我认为可能好学一些,MVC我是了解的,那这个“纯MVC”应该学起来也不难!开始我们的学习之旅吧~~~! PureMVC是什么东东?不知道,百度一下。咔咔咔,慢慢看慢慢研究百度百科所讲,哎?发现更模糊了,哦,哦,哦,有单例模式、中介者模式、观察者(发布订阅)模式、外观模式、代理模式、命令模式,我擦嘞,这些都是什么东东。想想Gof的23种设计模式,顺便对其中几个比较模糊的又进行一番网上学习,总算是把大概弄懂了。 回到我们的PureMVC上,学习嘛,看博客文章,别人的分享。这篇《flex框架pureMVC的使用:第一步》,写的很精彩,语言也通俗易懂。第一遍读完,没明白;又来了一遍,还是没理解,反反复复看了好多遍,最终也才能明白50%左右,这怎么能行。哪里来的困惑呢,在自以为看懂的时候,随意翻了一下留言记录,看到有些人对博主撰写的文章质疑,提出的问题也确实很关键,我自己也反思好久扔不知如何解决,然后我就楞了,我靠,哥们你写的这东西靠不靠谱啊,别弄了大半天我学的是错误的内容,忧心忡忡的样子让我十分难堪。怎么办? 还是老老实实的,读一遍源码吧,对,自学源码。 惊呆了有木有,这就才几个源代码文件呐,就有如此的好用的框架,3个核心类,10个接口,8个接口实现类,各司其职,各有所用。 专心认真的读一下,每个类中没有多少行,逻辑也比较易懂,看完后就会豁然开朗,啊,原来是这么回事。 PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。三个单例模式的核心类,以及单例模式的外观类Facade。 model:Model保存对Proxy对象的引用,Proxy负责操作数据模型,与远程服务通信存取数据,保证了Model层的可移植性; view:View保存对Mediator对象的引用。Mediator对象操作具体的视图组件,直接改变视图组件的状态,实现把视图和控制它的逻辑分离开来。 controller:Controller保存所有Command的映射。Command类是无状态的,只在需要时才被创建。Command可以获取Proxy对象并与之交互,发送Notification,执行其他的Command。经常用于复杂的或系统范围的操作,如应用程序的“启动”和“关闭”。应用程序的业务逻辑应该在这里实现。 Facade:单例模式,负责初始化核心层(Model,View和Controller),并能访问它们的Public方法。在实际的应用中,只需继承Facade类创建一个具体的Facade类就可以实现整个MVC模式,不需要在代码中导入编写Model,View和Controller类。Proxy、Mediator和Command就可以通过创建的Facade类来相互访问通信。 过多的代码解读,不过多介绍,相信大多数人都能看得懂源码,在学习的时候最大的疑惑就是,为什么发送一个notification,就会有相对应的medicator,command执行对应的操作呢,它们是怎么知道有这样的notification发送呢?找啊找啊找,找啊找啊找,找到一个好朋友,敬个礼啊,握个手啊,我去,原来在这: IFacade接口文件中定义如下函数:
function notifyObservers( note:INotification ) : void; Facade接口实现类中:
public function notifyObservers ( notification:INotification ):void { if ( view != null ) view.notifyObservers( notification ); } view是IView接口的实现类的引用,那我们就去View类中找。 在function notifyObservers( notification:INotification ){}中最关键的一行 L126行,observer.notifyObserver( notification ); 再去看Observer类
public function notifyObserver( notification:INotification ):void { this.getNotifyMethod().apply(this.getNotifyContext(),[notification]); } 调用到AS3最低层的函数,这没跑了。 this.getNotifyMethod()是函数,也就是即将执行的方法名; this.getNotifyContext()是对象,也就是执行上述方法的对象; [notification]是通知数组,也就是上述对象执行上述方法需要传递的参数,说白了就是括弧中的东西。 我们回过头来看看View类: public function registerObserver ( notificationName:String,observer:IObserver ) : void{}方法 observerMap[ notificationName ] = [ observer ]; observerMap是以notificationName存储的observer的对象实例; 而public function registerMediator( mediator:IMediator ) : void{}中 var observer:Observer = new Observer( mediator.handleNotification,mediator ); mediator是以自己的handleNotification为执行函数进行注册的,所以在执行notifyObservers( notification:INotification )方法时就相当于循环执行如下语句: mediator.handleNotification(notificationName); 我们再看看Controller类:
public function registerCommand( notificationName : String,commandClassRef : Class ) : void { if ( commandMap[ notificationName ] == null ) { view.registerObserver( notificationName,new Observer( executeCommand,this ) ); } commandMap[ notificationName ] = commandClassRef; } executeCommand是什么?
public function executeCommand( note : INotification ) : void { var commandClassRef : Class = commandMap[ note.getName() ]; if ( commandClassRef == null ) return; var commandInstance : ICommand = new commandClassRef(); commandInstance.execute( note ); } 哦,是这样啊。为什么command能够执行对应的notificationName原来如此啊。 也就相当于是command.execute(notificationName); ======================================================== 总算是把核心代码,核心方法给搞定了,剩下的就是如何来真正使用这个框架。看明白了只能说是你看懂了,真正的会用才是真的会。在源码中都有对每个方法每个类作用的注释,在通读精度代码后再看看注释,会对理解的更清晰,具体的PureMVC框架的例子,之前介绍给大家的Blog中就很好,而且个人认为也比较正确的,对于其中的几个失效链接无所谓,关键在于理解框架思想。同时,在网上还能找到相关的例子应用,比较多。 解压缩puremvc-as3-standard-framework-master.zip文件,你会在根目录下发现"README.md",这个里面也有很好的例子,就是有些久远罢了。 pureMVC的版本有些年头,不知道现在还有没有人使用这个东西,再加上已经没落的Flex编程技术,不知道学这个还有没有用处。说回来,不管这框架以后怎样,在整个学习的过程中还是有很多感悟,别人的代码读起来就是比自己写的那个精彩简洁,能学到的还是很多很多。 接下来,会对实际使用的流程演示任务采用这个框架,反正项目不着急,正好拿来练练手,顺便熟悉熟悉。再往后,应该学习学习其他的几个框架。 加油,只要你认真,什么都不是事。这都不是事,该死的春运,该死的假日办。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |