最近在看puremvc。
MVC是Model-View-Controller的缩写,Model指数据模型,View指用户界面,Cotroller指控制器。使用MVC的目的是将M和V分离,从而使同一个程序可以有不同的表现形式。例如,一批统计数据你可以分别用柱状图,条形图或饼图来表示(这种数据对应多个表现形式,又叫做数据的多态呈现)。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。MVC是一个设计模式,它强制性的使应用程序的数据,表现和业务逻辑分开。采用MVC模式设计的应用程序都会被分成三个核心模块:模型,视图和控制器,它们各自处理自己的任务。
模型表示企业数据和业务规则,负责生成,获取,保存和修改应用程序的数据内容。例如,它可以是一个数据生成器,也可以是一个操纵数据库的组件。通常情况下,在MVC的三个模块中,模型拥有最多的处理任务。被模型返回的数据应当是中立的,就是说模型与数据格式无关,这样一个模型才能为多个视图提供数据。由于应用模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
视图是用户看到并与之交互的界面,负责捕获用户输入和根据数据进行内容展示。
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。
现在我们总结一下MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
用PureMVC创建健壮,易扩展,易维护的客户端程序
PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model,View和Controller
在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model,View,Controller.三者合称为核心层核心角色。
PureMVC中还有另外一个单例模式类,Facade,Facade提供了与核心层通信的唯一接口,以简化开发复杂度。
Model保存对Proxy对象的引用,Proxy负责操作数据模型,与远程服务通信存取数据。这样保证了Model层的可移植性。
View保存对Mediator对象的引用。由Mediator对象来操作具体的视图组件(View Component),包括:添加事件监听器,发送或接收Notification,直接改变视图组件的状态。
这样做实现了把视图和控制它的逻辑分离开来。
Controller保存所有Command的映射。Command类是无状态的,只在需要时才被创建。
Command可以获取Proxy对象并与之交互,发送Notification,执行其它的Command。经常用于复杂的或系统范围的操作,如应用程序的“启动”和“关闭”。应用程序的业务逻辑应该在这里实现。
Facade类应用单例模式,它负责初始化核心层(Model,View和Controller),并能访问它们的Public方法。
Proxy,Mediator和Command就可以通过创建的Facade类来相互访问通信。
发送Notification可以触发相应的Observer.
Facade保存了Command与Notification之间的映射,当Notification被发出时,对应的Command就会自动地由Controller执行。Command实现复杂的交互,降低view和Model之间的耦合性。
Mediator发送,声明,接收Notification
当用View注册Mediator时,Mediator的listNotifications方法会被调用,以数组形式返回该Mediator对象所关心的所有Notification.
之后,当系统其它角色发出同名的Notification时,关心这个通知的Mediator都会调用HandleNotification方法并将Notification以参数传递到方法。
在很多场合下Proxy需要发送Notification,比如Proxy从远程服务接收到数据时,发送Notification告诉系统,或当Proxy的数据被更新时,发送Notification告诉系统。
如果让Proxy也侦听Notification会导致它和View层,Controller层的耦合度太高。
View和Controller必须监听Proxy发送的Notification,因为它们的职责是通过可视化的界面使用户能与Proxy持有的数据交互。
不过对View层和Controller层的改变不应该影响到Model层。
例如,一个后台管理程序和一个面向用户程序可能共用一个Model类,如果只是用例不同,那么View/Controller通过传递不同的参数就可以共用相同的Model类。