简介
CAA V5的对象间的回调机制是通过发布/订阅的方式实现的。比如有两个对象:A和B,其中A作为时间的发布者,B作为事件的订阅者,当事件发生的时候,A对象会通知B对象。事件的订阅者和发布者的基类是CATBaseUnknown或者CATEventSubscriber。对于一些特定的事件存在也存在着消息的回调,比如主程序由于空闲而退出,等待时间超时,更改文件的描述符等。
什么是回调机制
回调机制是通过发布/订阅的方式来实现的,可以对比一下日常生活中的例子。
比如,如果有新的新闻报道时,报社需要将这些信息发布出去,使得所有的读者都能读到。这些读者可以分为两类:每天自己买报纸的;还有订阅报社的报纸,每天报社负责送货上门的。对于订阅报纸的,报社需要有专门的邮递员,将报纸送到订阅者的家里。邮递员需要维护订阅者的名单信息,同时会增加订阅者和取消订阅者。
回调机制与报社的机制很相似。一个对象会通过通知的方式发布事件,回调管理员会维护这些通知,并保证通知送达到订阅者对象。订阅者会订阅一个对象的指定通知,当该通知发出时,订阅者能够被通知。
如何使得一个对象变为订阅者或者发布者
有两种方式可以使得一个对象变为发布者或者订阅者
- 最常用的方式是对象以CATBaseUnknown为基类,通过全局的函数让订阅者订阅指定的事件,让发布者发布指定的通知。这种事最常用也是推荐的方式。
- 另外的一种方式是对象以CATEventSubscriber作为基类,通过实现订阅或者发布函数,来实现回调。
以CATBaseUnknown作为基类
这种方式是最常用的一种方式。为了说明过程,可以列举一下生活中的例子。假如你的公寓有报警器保护,如果你不在家的时候,有强盗强行闯入的话,报警器就会报警。通常报警器想起后,强盗就会收到惊吓,从而逃走。当然,如果强盗如果能够关闭报警器,那就是另外的故事了。
在这个场景下存在着事件的订阅者和发布者,发布者为报警器,订阅者为强盗。在整个过程中,报警器通过报警来发出生硬,表明自己被激发;而强盗虽热没有明显的订阅过程,但是他有耳朵,会自然地听到声音。而在程序的世界里,对象是没有耳朵的,只能人为的指定对象去订阅哪些事件。各个对象之间的关系如下
-
首先创建时间的发布者:报警器。它以CATBaseUnknown为基类,存在一个方法BeginRinging
#include "CATBaseUnknown.h" class ApartmentAlarm : public CATBaseUnknown { CATDeclareClass; public: ApartmentAlarm(); virtual ~ApartmentAlarm(); void BeginRinging(); };
-
创建发出的通知类:AlarmRinging。 该类以CATNotification作为基类,在头文件中仅包含CATDeclareClass
#include "CATNotification.h" class AlarmRinging : public CATNotification { CATDeclareClass; };