消息管理器是用来在各个实体对象和功能模块之间进行数据通信的.一个好的消息管理器可以最大限度的实现解藕操作,使得模块具有"热插拔"特性,这是我们所希望达到效果.但是在实现的过程中有几点细节实现需要仔细斟酌,比如消息管理与分发的方式,如何实现一个通用的支持动态更新的消息管理器.下面是我学习根据自身经验实现的一个消息管理器,希望能够抛砖引玉,共同提高 :)
基本思路:
1. 面向接口编程: 实现一个IMsgListener抽象接口类,所有需要消息处理的类都需要从该接口类继承.
2. 以列表的方式对单一消息的所有监听器进行管理维护: 这样做的目的是可以动态的改变监听者的意图.
3. 采用有针对性的分发方式:在2的基础上进行消息分发,而不是老式的对所有监听器发送.
4. 细化消息处理返回值: 这样做可以减少不必要的消息发送,提高效率的同时更符合实际需要.
主要代码如下:
1. 监听者接口类:
1
/**//**
2
@ Enum: 处理消息的结果
3
@ Mark:
4
*/
5
enum enMsgHandleResult
6

{
7
EMHR_UNKNOWN, // 不识别
8
EMHR_IGNORE, // 忽略不处理
9
EMHR_CONTINUE, // 处理并继续
10
EMHR_TERMINATE, // 私有消息,处理后不允许继续分发继续处理
11
};
12
13
/**//**
14
@ Class: 消息处理器接口
15
@ Mark:
16
*/
17
class IMsgListener
18

{
19
public:
20
virtual ~IMsgListener( void )
{};
21
public:
22
/**//**
23
@ Function: 消息接收
24
@ Mark:
25
*/
26
virtual enMsgHandleResult HandleMessage( size_t msgid, const CVarList& varlist ) = 0;
27
28
/**//**
29
@ Function: 获取监听器名字
30
@ Mark:
31
*/
32
virtual const char* GetName( void ) = 0;
33
34
/**//**
35
@ Function: 获取监听器ID
36
@ Mark:
37
*/
38
virtual CHashItem GetID( void ) = 0;
39
};
posted on 2009-04-08 11:51
Kevin Yuen 阅读(740)
评论(1) 编辑 收藏 引用 所属分类:
Game