PureMVC 架构流程

PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。

· 在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model、View和  
Controller。三者合称为核心层或核心角色。

· PureMVC中还有另外一个单例模式类——Façade,Façade提供了与核心层通信的唯一接口,以简化开发
复杂度。

我们首先来看下面这一张图:


在这张图中能够清晰的看到pureMVC分为四个主要的部分,
1.首先来看下Façade类应用单例模式,它负责初始化核心层(Model,View和Controller),并能访问它们的Public方法

2.View 与 Mediator
View保存对Mediator对象的引用 。由Mediator对象来操作具体的视图组件,包括:添加事件监听器 ,发送或接Notification ,直接改变视图组件的状态。这样做实现了把视图和控制它的逻辑分离开来。这样在FLEX的视图组件中我们将更关注视图的布局自身事件的简单处理

3.Model 与 Proxy
Model保存对Proxy对象的引用,Proxy负责操作数据模型(Value Object),与远程服务通信存取数据。 这样保证了Model层的可移植性。

4.Controller 与 Command
Controller保存所有Command的映射。Command类是无状态的,只在需要时才被创建。 Command可以获取Proxy对象并与之交互,发送Notification,执行其他的Command。经常用于复杂的或系统范围的操作,如应用程序的“启动”和“关闭”,负责获取Mediator发出的通知调用prox类获取数据等等。应用程序的业务逻辑应该在这里实现。

5.此外你还需要对pureMVC的通信机制有所了解。
PureMVC的通信并不采用Flash的EventDispatcher/Event,因为PureMVC可能运行在没有Flash Event和EventDispatcher类的环境中,它的通信是使用观察者模式以一种松耦合的方式来实现的。你只需要使用一个非常简单的方法从Proxy, Mediator, Command和Facade发送Notification,由于pureMVC的通信采用弱类型,因此你可以不用像使用FLEX派发事件那样针对不同的事件编写不同的事件类(指需要在派发事件同时传递参数的情况)

6.pureMVC中各层次通信规则
Proxies,Mediators与Commands类之间的通讯是通过广播Notifications来实现松耦合和跨平台特性的
    ○ Notification可以被用来触发Command的执行
    ○ Mediator发送、声明、接收Notification
    ○ Proxy发送,但不接收Notification

有关更详细的请查阅“PureMVC_Implementation_Idioms_and_Best_Practices_cn.pdf”(中文版)

对pureMVC有了大概的认识后我们再来看这张架构流程图:



我们以一个程序的启动过程来对这张图进行一个简单的描述:

1.首先找到蓝色的“ApplicationFacade”,该类应当是一个继承自facade的自定义类,facade采用了单例模式,他的主要功能就是负责启动系统程序(facade类中有个startup负责此项功能)以及注册Mediator和Command和Proxy类,并且pureMVC中的每个Mediator和Command和Proxy都具有获取facade引用的方法。
在这里ApplicationFacade先是注册一个通知名称到指定的Command类上(registered Command),然后从主MXML文件中启动程序时会第一次初始化ApplicationFacade类并调用startup方法来来派发一个启动程序的通知(Notification)

2.所有的通知都由“pureMVC Notification System”这个模块来管理,“pureMVC Notification System”获取到第一步派发的启动通知后,就会根据先前注册的Command类的名称去创建对应的Command类对象

3.现在Command类已经被创建了(看蓝色的“Command”),在Command中我们会获取ApplicationFacade类的引用去注册页面UI对应的Mediator和获取数据用的Proxy。接下来你可以先去获取系统首页显示需要的数据,这时我们在Command类中通过ApplicationFacade去获取之前注册Proxy类,然后访问Proxy中的获取数据的方法,此时程序执行到“Model Proxy”模块

4.现在来到“Model Proxy”模块,在这里我们从调用server端获取想要的数据后将数据返回给Command模块(注:在Proxy中是可以直接发送通知,告知数据获取成功并将数据做为报体发送出去)

5.再次的回到Command模块,当成功的获取到数据后我们派发一个成功获取数据的通知,并将数据作为报体送出

6.在第三步中提到去注册一个Mediator,Mediator类会保存一个页面UI的引用,在Mediator类中提供了一个用于告诉系统这个类关心哪些通知的方法(listNotificationInterests)以及处理捕获通知的方法(handleNotification),我们在Mediator类中需要关心的是第5步中送出的通知。由于第五步已经派发出了成功获取数据的通知,我们在handleNotification方法中将会捕获该通知,那么在捕获到该通知后我们做什么呢?

7.现在看“UI Mediator 模块”,由于Mediator类主要是用来协调页面UI组件的所以在我们捕获到成功获取数据的通知后,我们在这里更新页面UI组件的数据源,例如在Mediator中我们保存了一个组件的引用,该组件利用DataGrid来显示数据(通常是引用一个自定义组件或者一个简单的页面),在这里我们就可以使用UI.DataGrid.dataPrivate = ArrayCollection,的方法来更新数据源。(注:这里主要是为了方便,通常我们不建议在Mediator中直接调用组件中的属性,这样可以降低页面UI和Mediator的耦合,以不至于没更新一次UI就要更新一次Mediator,对于这种情况你可以在MXML文件中的<mx:Script>标签中定义一个用于保存数据源的对象,这样当换成别的UI组件来显示数据时就只要更新MXML文件即可。当然如果整个组件都换的变换的那就无能为力了)。

8.至此程序已经启动完毕


二 与用户的交互

当用户在UI上点击了一个按钮需要切换显示页面时pureMVC是怎么工作的呢?
1.在页面UI内部我们对该按钮进行监听,然后在用户点击按钮的时候派发出切换页面的FLEX事件
 通常我们是在UI内部定义一个事件常量,然后在该UI的协调类Mediator中监听事件名称为在UI中定义的常量
 例如:MXML文件(Simple)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
    <![CDATA[
        public static const MY_CLICK:String ="myClick";//FLEX事件名称
        
        private function onClick():void{
            this.dispatchEvent(new Event(MY_CLICK));
        }
    ]]>
</mx:Script>
    <mx:Button click="onClick()"/>
</mx:Application>

Mediator类:
UI引用.addEventListener(Simple.MY_CLICK,onClick);

Private function onClick(evt:Event):void{
    ...
}

2.当Mediator捕获到FLEX Event后,就可以进行其他的处理了,在这里我们移走不需要显示的UI,将需要显示的UI添加到显示页面中,同时派发一个pureMVC的通知,通知我们需要注册一个显示页面(报体为新添加显示的UI对象)的Mediator类,并且需要更新数据(假设Command已经注册)。

3.通知派发后就由“pureMVC Notification System”模块来处理通知,将通知分配给注册的Command,接着后面的过程也就和前面说的一样了

OK,希望能对大家有点用,有不对的地方还请指正。

你可能感兴趣的:(设计模式,UI,应用服务器,Flex,Flash)