加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash MVC框架

发布时间:2020-12-15 17:50:47 所属栏目:百科 来源:网络整理
导读:为什么要用mvc? 1可以有效的减少代码层级关系的耦合性,一个层级关系变了。其他跟着变化的少。 2可以让结构更加清晰,有利于维护。利于对整个项目容易阅读和理解。 什么叫mvc? MVC模式是”Model-View-Controller”的缩写,中文翻译为”模式-视图-控制器”

为什么要用mvc?

1可以有效的减少代码层级关系的耦合性,一个层级关系变了。其他跟着变化的少。
2可以让结构更加清晰,有利于维护。利于对整个项目容易阅读和理解。

什么叫mvc?

MVC模式是”Model-View-Controller”的缩写,中文翻译为”模式-视图-控制器”。MVC应用程序总是由这三个部分组成。 Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性, 所有依赖的View都会自动更新。MVC模式能使界面(Viwe)和数据(Model)能有效的分开,由控制器(Controller)


如何初始化和调用mvc?

MVC的初始化过程:

1、main函数 创建模型,创建控制器
(模型并不总是在main函数创建的,不要不把模型的内存消耗当回事)
2、将模型的引用传入控制器
(由于上面的原因,控制器并不总是拥有模型的引用,但它应当拥有创建和找到模型的方法)
3、控制器中生成视图
(视图并不总是由控制器生成的,虽然由控制器生成视图有诸多好处,但的确有些框架不是这样的,例如Cairngorm。控制器生成视图相对new的方式较为繁琐。)

MVC的调用过程
1、main函数调用控制器的 方法
2、控制器调用 视图和模型的 方法
控制器不应该同时调用视图和模型的方法,而应该某些控制器调用模型的方法,有些控制器调用视图的方法,否则他们会被绑成一个整体,成为一对一的状态,这样C的分离就没有意义了。
3、模型计算完毕后 发事件给视图
计算的人是C,模型应当没有逻辑。
另外由于M是不能拥有视图的引用的,所以它应当发给控制器,或者发给自己利用观察者模式。
4、视图接收到事件 更新视图。
更新视图的人可以是V,但做出监听操作的应当是C,也就是说C接收到事件然后执行V的更新方法。

虽然我们在实际应用中经常不分离C,所以C的逻辑会分散在M和V里,但那还是C的事情,不能认为那就是因该M或者V做的,否则C就没事做了。讲的是MVC而不是MV。


能否给个mvc例子?

我们现在以一个比较简单的电子时钟的例子来看看如何使用MVC模式来架构我们的程序.

首先我们来看一下Model,Model按照我的理解是数据,就是所有的共用数据都是存储在Model里面的,时钟里有这样的数据,小时,分钟,秒;现在我们来建立一个Model,ModelLocator.as:

  1. package?net.smilecn.clock.model{
  2. ? ?
  3. ? ??import?flash.events.EventDispatcher;
  4. ? ??import?flash.events.Event;
  5. ? ?
  6. ? ??public?class?ModelLocator?extends?EventDispatcher{
  7. ? ?
  8. ? ? ? ??private?var?_hour:String;
  9. ? ? ? ?
  10. ? ? ? ??private?var?_minutes:String;
  11. ? ? ? ?
  12. ? ? ? ??private?var?_second:String;
  13. ? ? ? ?
  14. ? ? ? ??public?function?ModelLocator():void{
  15. ? ? ? ??}
  16. ? ? ? ?
  17. ? ? ? ??public?function?get?hour():String{
  18. ? ? ? ? ? ??return?_hour;
  19. ? ? ? ??}
  20. ? ? ? ?
  21. ? ? ? ??public?function?set?hour(value:String):void{
  22. ? ? ? ? ? ??_hour?=?value;
  23. ? ? ? ? ? ??dispatchEvent(new?Event("changeHour"));
  24. ? ? ? ??}
  25. ? ? ? ?
  26. ? ? ? ??public?function?get?minutes():String{
  27. ? ? ? ? ? ??return?_minutes;
  28. ? ? ? ??}
  29. ? ? ? ?
  30. ? ? ? ??public?function?set?minutes(value:String):void{
  31. ? ? ? ? ? ??_minutes?=?value;
  32. ? ? ? ? ? ??dispatchEvent(new?Event("changeMinutes"));
  33. ? ? ? ??}
  34. ? ? ? ?
  35. ? ? ? ??public?function?get?second():String{
  36. ? ? ? ? ? ??return?_second;
  37. ? ? ? ??}
  38. ? ? ? ?
  39. ? ? ? ??public?function?set?second(value:String):void{
  40. ? ? ? ? ? ??_second?=?value;
  41. ? ? ? ? ? ??dispatchEvent(new?Event("changeSecond"));
  42. ? ? ? ??}
  43. ? ?
  44. ? ??}
  45. ? ?
  46. }

这个代码应该会好懂,这里ModelLocator继承了EventDispatcher这个类,继承这个类的原因是ModelLocator需要用dispatchEvent发消息出去。再来看一下Controller.as这个类:

  1. package?net.smilecn.clock.control{
  2. ? ?
  3. ? ??import?flash.utils.Timer;
  4. ? ??import?flash.events.TimerEvent;
  5. ? ?
  6. ? ??import?net.smilecn.clock.model.ModelLocator;
  7. ? ?
  8. ? ??public?class?Controller{
  9. ? ? ? ?
  10. ? ? ? ??private?var?_model:ModelLocator;
  11. ? ? ? ??private?var?_timer:Timer;
  12. ? ? ? ?
  13. ? ? ? ??public?function?Controller(model:ModelLocator):void{
  14. ? ? ? ? ? ??_model?=?model;
  15. ? ? ? ??}
  16. ? ? ? ?
  17. ? ? ? ??public?function?startTime():void{
  18. ? ? ? ? ? ??_timer?=?new?Timer(1000,0);
  19. ? ? ? ? ? ??_timer.addEventListener(TimerEvent.TIMER,timerHandler);
  20. ? ? ? ? ? ??_timer.start();
  21. ? ? ? ??}
  22. ? ? ? ?
  23. ? ? ? ??private?function?timerHandler(event:TimerEvent):void{
  24. ? ? ? ? ? ??var?nowDate:Date?=?new?Date();
  25. ? ? ? ? ? ??_model.hour?=?nowDate.getHours()>9?String(nowDate.getHours()):"0"+nowDate.getHours();
  26. ? ? ? ? ? ??_model.minutes?=nowDate.getMinutes()>9?String(nowDate.getMinutes()):"+nowDate.getMinutes();
  27. ? ? ? ? ? ??_model.second?=nowDate.getSeconds()>9?String(nowDate.getSeconds()):"+nowDate.getSeconds();
  28. ? ? ? ??}
  29. ? ? ? ?
  30. ? ??}
  31. }

这个类中我们用到了Timer类,因为我们用的是时钟,所以需要一个定时器,Timer是一个很好的定时器,Timer(1000,0),这里 1000是指1000毫秒,就是1秒钟触发一次定时钟,0表示次数,这里0是无限次,如果是大于0的数就是这个数的次数。侦听 TimerEvent.TIMER事件就是1秒钟去执行一次timerHandler方法,timerHandler方法的功能是得到当前的时间然后去改 变_model里面的值,再看一下ModelLocator.as里面的代码,当hour,minutes,second的值改变的时候就会去发消

息出去,那么谁来侦听这些消息呢,当然是View,现在来看下View.as:

  1. package?net.smilecn.clock.view{
  2. ? ?
  3. ? ??import?flash.display.Sprite;
  4. ? ??import?flash.events.Event;
  5. ? ??import?flash.text.TextField;
  6. ? ?
  7. ? ??import?net.smilecn.clock.model.ModelLocator;
  8. ? ??import?net.smilecn.clock.control.Controller;
  9. ? ?
  10. ? ??public?class?View?extends?Sprite{
  11. ? ? ? ?
  12. ? ? ? ??private?var?_model:ModelLocator;
  13. ? ? ? ??private?var?_controller:Controller;
  14. ? ? ? ??private?var?time_txt:TextField;
  15. ? ?
  16. ? ? ? ??public?function?View(model:ModelLocator,controller:Controller):void{
  17. ? ? ? ? ? ??_model?=?model;
  18. ? ? ? ? ? ??_controller?=?controller;
  19. ? ? ? ? ? ??time_txt?=?new?TextField();
  20. ? ? ? ? ? ??addChild(time_txt);
  21. ? ? ? ? ? ??_model.addEventListener(",changeTimeHandler);
  22. ? ? ? ? ? ??_model.addEventListener(changeTimeHandler);
  23. ? ? ? ? ? ?
  24. ? ? ? ? ? ??_controller.startTime();
  25. ? ? ? ??}
  26. ? ? ? ?
  27. ? ? ? ??private?function?changeTimeHandler(event:Event):void{
  28. ? ? ? ? ? ??time_txt.text?=?_model.hour+"?:?"+_model.minutes+"+_model.second;
  29. ? ? ? ??}
  30. ? ?
  31. ? ??}
  32. }

在View里面,侦听了_model的事件,所以当收到数据改变的消息后,将_model的数据显示到文本框中。

要使程序运行,我们现加一个文档类:

  1. package?net.smilecn.clock{
  2. ? ?
  3. ? ??import?flash.display.Sprite;
  4. ? ?
  5. ? ??import?net.smilecn.clock.model.ModelLocator;
  6. ? ??import?net.smilecn.clock.control.Controller;
  7. ? ??import?net.smilecn.clock.view.View;
  8. ? ?
  9. ? ??public?class?Clock?extends?Sprite{
  10. ? ? ? ?
  11. ? ? ? ??private?var?_model:ModelLocator;
  12. ? ? ? ??private?var?_controller:Controller;
  13. ? ? ? ??private?var?_view:View;
  14. ? ? ? ?
  15. ? ? ? ??public?function?Clock():void{
  16. ? ? ? ? ? ??_model?=?new?ModelLocator();
  17. ? ? ? ? ? ??_controller?=?new?Controller(_model);
  18. ? ? ? ? ? ??_view?=?new?View(_model,_controller);
  19. ? ? ? ? ? ??addChild(_view);
  20. ? ? ? ??}
  21. ? ? ? ?
  22. ? ??}
  23. }

在文档类中建立了ModelLocator、Controller、View的实例,ModelLocator产生的实例被传到了 Controller和View中,这样就保证了Controller和View使用是相同的ModelLocator,其实要达到这种效果不用这种方法 也可以,可以用到上一节中用到的单例模式。

这里作一个总结,Controller是一个控制者,它去改变ModelLocator,ModelLocator的数据被改变后去更新View, 使我们能看到数据。如果界面上有一些按钮交互,那么就应该是Controller去响应View里的按钮交互,响应后去通过一些操作后改变 ModelLocator,ModelLocator数据改变后通知View去改变界面。

有人可以会说这个程序用更少的代码就可以完成,但这里只是演示程序的架构,当程序很大时,好的架构会使程序更清晰。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读