第一次使用PureMVC时,觉得各个组件太过于繁琐,很难一下明白他们的含义。

          看官方的文档,说的很详细,很清楚,但是很难一下真正的工作流程,到后来会用了,也不清楚。

         今天有时间,于是决定调试下源码,揭开PureMVC的庐山真面目。

         在使用时,只要使用Facade.getInstance()方法,就可以万事大吉,但是想想那些组件,总有很多个问题搞不懂,于是就从getInstance方法开始入手,用一张简单得图来说明下各个方法的调用时序,看看这个方法到底做了那些内容。

 

//Facade 构造方法中会初始化Model,Controller,View组件
protected function initializeFacade(  ):void 
{
	initializeModel();
	initializeController();
	initializeView();
 }

//Controller 中也有一个方法,此方法用于初始化View,注意,此方法和Facade中的InitializeController不同,此时Controller类中保留一个对View的引用
protected function initializeController(  ) : void 
{
	view = View.getInstance();
}


由上面的代码和调用时序图可以得出以下的结论:

 

1.初始化Facade时,会执行基类Facade中的构造方法,初始化Model,Controller,View组件,所以Facade将保存对这3个组件的引用

2.初始化Model时,Model会建立一个Array用于管理Proxy,所有将拥有多个Proxy。

3.初始化Controller时,会缓存Command与自定义通知的映射关系,以及对View组件的引用。

4.初始化View时,会建立一个mediatorMap,observerMap,用于缓存Mediator和Obserser(观察者)。

5.一般在自定义Facade中initializeController中调用基类Facade的initializeController执行完成上述调用后,会再次调用Facade的 registerCommand方法,用于注册Command和消息的映射。

6.Facade肯定是门面模式,负责整理这些错综复杂的调用关系,所有它的相关方法都是用于协调关系的,所以Facade.registerCommand方法其实默认调用的是Contrller组件的registerCommand。

7.Controller的registerCommand方法,会将自身和executeCommand方法封装成一个观察者(Observer实例),再和消息名作为参数,调用view.registerObserver向View注册一个观察者(Observer实例),同时Controller类会将command Class和消息名缓存到commandMapArray中。

 

其实简单得一个getInstance方法,包含了量的工作,正是因为初始化的顺序太繁复,所以pureMVC引入了Facade类,用门面模式简化了这种关系,方便了调用,从初始化的顺序,可以看到组件间的相互关系,这对理清思路有很大的帮助,其实从初始化中我们可以看到的时PureMVC静态的关系,也就是它的基本结构,所以要明白工作的流程和原理,还必须从完整的一个事件跟踪才可以。有点累,下午继续。

 

 

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐