分享

消息映射深度探索(1):基础面

 戴维图书馆 2012-12-10

消息映射深度探索(1):基础面

251人阅读 评论(0) 收藏 举报

消息映射这项技术,给消息横向(多个类对象)或纵向(继承树)流动的机会。

此技术最初之发展动机是为了简化win32程序的消息处理过程,后来也被应用到网络程序的消息处理。一旦某个消息到达win32消息处理函数,此函数就会 使用一个switch...case映射网将此消息映射至相应处理函数。switch...case具有与生俱来的缺点:难于扩展,效率低下。随着消息的 增多,switch...case将变得庞大而不堪重负。消息映射可以解决这个问题,因为当对象运用了消息映射技术后,对象自己就能够处理消息(或者说对外界宣告,我能处理这个消息,请把它交给我处理)。

消息映射架构在一大堆有趣的细节之上。在深入到细枝末节前,先让我们看下基础面:传统的不使用消息映射程序是如何实作的?下面是一种可能:

void HandleMessage( Message* message ) {
    switch ( message->GetID() ) {
        case MessageID_A:
            FunctionA( message );
            break;
        ...
        case MessageID_N:
            FunctionN( message );
            break;
        default:
            assert( false && "Unknown message" );
    }
}

这个做法几乎不具备任何扩展性,如果HandleMessage()被封装到库中那就意味着用户不再有任何修改的机会,那么用户该如何针对自己喜爱的消息做特殊处理,而忽略那些不打算处理的消息呢?

继续前行之前,我们先来了解几个将被使用的宏:

#include <iostream>

#define PRINT( msg ) { std::cout << msg << std::endl; }
#define FUNC( func ) void func() { PRINT( #func##"()" ); }
#define MFUNC( class, func ) void func() { PRINT( #class##"::"###func##"()" ); }
#define VMFUNC( class, func ) virtual MFUNC( class, func )

namespace AutoTest {
    FUNC( func );

    struct TestStruct {
        MFUNC( TestStruct, func );
        VMFUNC( TestStruct, vfunc );
    };
   
    void TestPRINT() {
        PRINT( "PRINT()" );
        func();
        TestStruct t;
        t.func();
        t.vfunc();
    }
}

void main() {
    AutoTest::TestPRINT();
}

这里列出了一些宏,用于打印或者产生一些简单的全局打印函数或者成员函数。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多