继承、虚函数的应用模式:事件注册与调度机制

基于事件注册、触发调用的机制实现具有可扩展的c++程序。

在之前曾经看到过的一个程序,看到了这种基于事件注册,然后触发的机制,所以特别想细细的分析一下,然后总结一个demo,分享给需要学习虚函数、继承的同学。


在介绍之前,想问一下大家,或者对c++有一点编写经验的同学,有没有感觉自己写的程序很low,很没有结构化,而且可拓展性有点差的感觉?下面开始介绍这种机制,非喜及喷,不吝赐教。


情景再现:举一个不是特别恰当的例子,在玩《王者荣耀》这种游戏时,蔡文姬释放回血的技能,那么不管是友方英雄还是敌方英雄遇到这种情况,在技能范围内,一定对这个技能进行不同的反映。如果有一天,设计师对蔡文姬英雄进行改版,增加一个技能,那么程序该怎么做到可扩展性?如果在原有的5V5模式中,增加为6V6,那么程序该怎么做到可扩展性?下面这个方法是一个自我总结的模式。

这是UML类图,在这里主要涉及到的关系是泛化关系,泛化关系指的是一种继承关系,箭头指向父类。下面分别介绍每个类的作用和关系:

    Event ,提供一些事件类型。EventType枚举中声明了Event_1和Event_2事件类型。 EventHandle,这里是定义一个纯虚函数,来声明一个处理事件的接口。 EventSource,提供事件注册和调度函数,注册的事件,会将其对象保存在map容器中,以便调度时动态调度。m_eventSourceMap声明为静态变量,在程序启动时初始化,程序结束时释放内存。 exampleA, 这里定义一个继承于类EventHandle的类,作为一个扩展的示例,类中必须提供处理事件的实际方法HandleEvent(),而且需要在初始化类对象的时候注册感兴趣的事件。 exampleB,同exampleA。 controlcenter, 初始化exampleA和exampleB,Control()调用DispatchEventHandle完成事件的调度,例如触发事件Event_1,那么注册该事件类型的并且提供处理该事件的example都会被执行一遍。在demo中,exampleA和exampleB都注册了event_1事件, 所以当触发该事件,这两个例子操作都会执行自己相关的处理。

扩展能力:增加example的个数,就可以增加人数;增加事件类型,就可以增加技能数。

下来链接:

经验分享 程序员 微信小程序 职场和发展