观察者模式

观察者模式用于事件的发生者与事件的关心者的解藕。

代码实现:采用单链表实现


/*定义事件通知的回调函数*/

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);

                }

        }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值