PureMVC - Pipes Util 实现 Module 之间消息通信


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 本身的架构。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;
 
        /**
         * Junction 连结对象,架构在 PureMVC 框架内,基于 Mediator 可转发 Notification 通知消息。
         */
        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;
                                }
                        }
                }
 
                /**
                 * 连结管道(Pipe)和接口(Interface)
                 */
                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 的演示程序.
本文来源于 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址:http://xinsync.xju.edu.cn/index.php/archives/4881

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值