首页 > AIR/RIA > PureMVC 学习笔记(一)

PureMVC 学习笔记(一)

一、PureMVC的目标很明确,把程序分为低耦合的三层:Model、View、Controller.这三部分由三个单例模式类管理。另外还有一个单例模式类——Façade,Façade提供了与核心层通信的唯一接口,并简化开发复杂度!

pureMVC

二、PureMVC结构

2.1 Model与Proxy:
  Model保存了对Proxy的引用,Proxy负责操作数据模型,与远程服务通信存取数据。这样保证了Model层的可移植性!
2.2 View与Mediator:
  View保存了对Mediator对象的引用。由Mediator对象来操作具体的视图组件(View Component),包括添加事件监听,发送或接收Notification,直至改变视图组件的状态!这样实现了视图与控制它的逻辑分离开来。
2.3 Controller与Command:
  Controller保存了所有Command的映射。Command类是无状态的,只有需要的时候才被创建。Command能够获取Proxy对象并与之交互,发送Notification,执行其它Command.经常用於复杂的或系统范围的操作,如应用程序的启动或关闭。应用程序的逻辑应该在这里实现。
2.4 Façade与Core:
  Façade类应用单例模式,它负责初始化核心层(Model、View、Controller),并能访问它们的public 方法。
  这样,实际上你只需要继承Façade类创建一个具体的Façade类就能实现整个MVC模式了,并不需要在代码中编写Model、Control、View类。Proxy、Command、Mediator就可以通过创建的Façade类来相互访问通信。
2.5 Observer与Notification:
  PureMVC并不采用Flash的EventDispatcher/Event,因为PureMVC可能运行在没有Flash Event或EventDispatcher的环境中,它的通信是使用观察者模式(Observer)以一种松耦合的方式来实现的。你只需要使用一个非常简单的方法从Proxy, Mediator, Command和Facade发送Notification,甚至不需要创建一个Notification实例。
2.6 Notification可以被用来触发Command的执行:
  Façade保存了Command与Notification之间的映射,当Notification发出时,对应的Command就会自动由Controller执行。Command实现复杂的操作,降低Model与View的耦合度。
2.7 Mediator 发送、声明、接收Notification
  当用View注册Mediator时,Mediator的listNotification方法会被调用,以数组方式返回所有该Mediator关心的Notification.
  之后,当系统其它角色发出同名的Notification(通知)时,关心这个通知的Mediator都会调用handleNotification方法并将Notification以参数传递到方法。
2.8 Proxy发送,但不接收Notification
  在很多场合下Proxy需要发送Notification(通知),比如:Proxy从远程服务接收到数据时,发送Notification告诉系统;或当Proxy的数据被更新时,发送Notification告诉系统。
如果让Proxy也侦听Notification(通知)会导致它和View(视图)层、Controller(控制)层的耦合度太高。
  View和Controller必须监听Proxy发送的Notification,因为它们的职责是通过可视化的界面使用户能与Proxy持有的数据交互。
  不过对View层和Controller层的改变不应该影响到Model层。
  例如,一个后台管理程序和一个面向用户程序可能共用一个Model类。如果只是用例不同,那么View/Controller通过传递不同的参数就可以共用相同的Model类。

PureMVC下载:PureMVC Standard Framework for AS3 (120)

在JavaEye上看到这篇关于PureMVC的入门教材,感觉不错:http://www.javaeye.com/topic/212110

欢迎转载,转载请注明来源和作者,谢谢!

1 条评论

  • (Required)
  • (Required, will not be published)

Verify Code   If you cannot see the CheckCode image,please refresh the page again!