PureMVC MutilCore 版本。所谓多核,是指程序中有多个 PureMVC 实例;在 Flex 中以 Module 方式实现,其中每个 Module 都有其Facade,独立的功能。但 PureMVC 未提供 Module 之间通信的方法,虽然可以通过 Interface 等方法来管理每个 Module,但这样程序间耦合性太高,无法体现MVC优点;好在有官方的解决方法,推荐使用 Pipes Util 解决 Module 之间的通信,Pipes Util 在 Module 之间构建了一层通信框架,使每个 Module 通过普通 Notification 的方式进行消息通信。
下面举例说明:主程序 Shell 与 Module 相互通信,两者都是独立的 PureMVC 框架。
Pipe Util 主要通过 JunctionMediator 与其他 Module 通信;由于 JunctionMediator 继承自 Mediator,可转发Notification 通知消息,所以就使 Module 之间的消息通信可利用 PureMVC 本身的架构。
- package cn.xinsync.kmeeting.shell.view
- {
- import cn.xinsync.kmeeting.common.PipeAwareModule;
- import cn.xinsync.kmeeting.shell.ApplicationFacade;
- import org.puremvc.as3.multicore.interfaces.INotification;
- import org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeAware;
- import org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeMessage;
- import org.puremvc.as3.multicore.utilities.pipes.messages.Message;
- import org.puremvc.as3.multicore.utilities.pipes.plumbing.Junction;
- import org.puremvc.as3.multicore.utilities.pipes.plumbing.JunctionMediator;
- import org.puremvc.as3.multicore.utilities.pipes.plumbing.Pipe;
- import org.puremvc.as3.multicore.utilities.pipes.plumbing.TeeMerge;
- import org.puremvc.as3.multicore.utilities.pipes.plumbing.TeeSplit;
- public class ShellJunctionMediator extends JunctionMediator
- {
- public static const NAME:String = "AppJunctionMediator";
- public function ShellJunctionMediator()
- {
- // Junction 是不可视的连结对象,只用于管理 Shell 主程序与 Module 之间通信联络
- // 实际就是两者之间的逻辑关系: 如响应、监听 Notification 消息, 如何转发等
- super(NAME, new Junction());
- }
- override public function listNotificationInterests():Array
- {
- return [ApplicationFacade.MODULE_ADDED, ApplicationFacade.SEND_MESSAGE];
- }
- override public function handleNotification(note:INotification):void
- {
- switch (note.getName())
- { // 每个 Module 都必须进行 Pipe(管道)连结管理
- case ApplicationFacade.MODULE_ADDED:
- { // 有新 Module 增加
- var module:IPipeAware = IPipeAware(note.getBody());
- connectPipe(module); // 每个 Module 都连结到管道
- break;
- }
- case ApplicationFacade.SEND_MESSAGE:
- { // 发送消息, 通过 junction 连结器裁决消息通过管道发送到指定的模块中。
- var message:Message = new Message(PipeAwareModule.SHELL_MESSAGE, null, note.getBody());
- junction.sendMessage(PipeAwareModule.SHELL_TO_MODULE, message);
- break;
- }
- }
- }
- private function connectPipe(module:IPipeAware):void
- {
- // 注册管道(Pipe)和管道接口(三通连结 TeeSplit(消息分离)/TeeMerge(消息聚合))
- junction.registerPipe(PipeAwareModule.SHELL_TO_MODULE, Junction.OUTPUT, new TeeSplit());
- junction.registerPipe(PipeAwareModule.MODULE_TO_SHELL, Junction.INPUT, new TeeMerge());
- // 监听消息 - 处理 Module 发送的 Notification 消息
- junction.addPipeListener(PipeAwareModule.MODULE_TO_SHELL, this, handlePipeMessage);
- // 通过管道连结 Module 与 Shell
- var moduleToShell:Pipe = new Pipe();
- module.acceptOutputPipe(PipeAwareModule.MODULE_TO_SHELL, moduleToShell);
- var shellInFitting:TeeMerge = junction.retrievePipe(PipeAwareModule.MODULE_TO_SHELL) as TeeMerge;
- shellInFitting.connectInput(moduleToShell);
- // 通过管道连结 Shell 与 Module
- var shellToModule:Pipe = new Pipe();
- module.acceptInputPipe(PipeAwareModule.SHELL_TO_MODULE, shellToModule);
- var shellOutFitting:TeeSplit = junction.retrievePipe(PipeAwareModule.SHELL_TO_MODULE) as TeeSplit;
- shellOutFitting.connect(shellToModule);
- trace("connected");
- }
- override public function handlePipeMessage(message:IPipeMessage):void
- {
- switch (message.getType())
- { // 响应、监听处理 Module 通过管道发送的 Notification 通知消息
- case PipeAwareModule.MODULE_MESSAGE:
- { // 使用 PureMVC 框架转发
- sendNotification(ApplicationFacade.GET_MESSAGE, message.getBody());
- break;
- }
- }
- }
- }
- }
连接(Junction)通过管道(Pipe)监听消息,通常写起来比较的麻烦,但可有效限制 Module 之间通信以及监听的消息。
注:本程序模仿自 Water and Bread 的演示程序.