观察者模式用于事件的发生者与事件的关心者的解藕。
代码实现:采用单链表实现
/*定义事件通知的回调函数*/
typedef void (*BlackHand_PF)(uint observer_event)
struct observer
{
/*单链表头*/
SL_Head obsever_head;
/*分配观察者ID, 这里为说明问题,简化处理; 正确应该使用位图*/
uint MaxobserverID;
}g_observer_data;
typedef struct tagobserverNode
{
/*单链表节点*/
SL_Node observer_Node;
uint observerID;
/*事件用比特位表示,32位的uint可以表示32种事件*/
uint observer_event;
BlackHand_PF pfBlackHand;
}observer_Node_S;
/*观察者初始话函数*/
ulong obsever_init(void)
{
g_observer_data.MaxobserverID = 0;
/*链表头初始化*/
SL_Init(&g_observer_data.obsever_head);
}
/*观察者解初始话函数*/
void observer_Fini(void)
{
/*释放单链表所有节点*/
SL_free_all(&g_observer_data.obsever_head);
g_observer_data.MaxobserverID = 0;
}
/*添加一个观察者函数*/
uint observer_add(uint observer_event, BlackHand_PF pfBlackHand)
{
uint observerID = 0;
observer_Node_S *pObserver_Node = NULL;
pObserver_Node = (observer_Node_S *)malloc(sizeof(observer_Node_S ));
if (pObserver_Node != NULL)
{
pObserver_Node->observerID = ++g_observer_data.MaxobserverID;
observerID =pObserver_Node->observerID;
pObserver_Node->observer_event = observer_event;
pObserver_Node->pfBlackHand = pfBlackHand;
/*将节点添加到链表中*/
SL_add(&g_observer_data.obsever_head, pObserver_Node);
}
r eturn observerID;
}
ulong observer_delete( uint observerID)
{
ulong ErrCode = ERROR_FAILED;
observer_Node_S *pObserver_Node = NULL;
/*遍历链表节点*/
SL_FOREACH_SAFE(&g_observer_data.obsever_head, pObserver_Node)
{
if (pObserver_Node->observerID == observerID)
{
/*将节点从链表中删除*/
SL_delete(&g_observer_data.obsever_head, pObserver_Node);
ErrCode = ERROR_SUCCESS;
break;
}
}
return ErrCode;
}
void observer_notify(uint observer_event)
{
observer_Node_S *pObserver_Node = NULL;
SL_FOREACH_SAFE(&g_observer_data.obsever_head, pObserver_Node)
{
if (pObserver_Node->observer_event | observer_event == observer_event)
{
pObserver_Node->pfBlackHaand(observer_event);
}
}
}