C语言的观察者模式

/*hdr
**  Copyright ...
**  AUTHOR              MichaelMa
**  DATE                4-May-2014
**  DESCRIPTION         implement a mode of observer in C
**  NOTE                may be some bugs             
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/***************************DEFINES************************************/
#define MAX_LIST_CNT	10
#define MAX_ID_LEN		256

/*
	zero members
*/
#define ZERO(TYPE,instance)	struct TYPE instance;	\
			instance.TYPE##_constructor = TYPE##_constructor;	\
			instance.TYPE##_constructor(&instance);	\

/***************************TYPEDEFS**********************************/
typedef struct _Observer* List;

struct _Observer
{
	char ID[MAX_ID_LEN];
	void (*_Observer_constructor)(struct _Observer*);
	void (*_Observer_destructor)(struct _Observer*);
	void (*_Observer_Update)(struct _Observer*);
};

struct _Fire
{
	unsigned short m_nObserverCnt;
	List m_listObservers[MAX_LIST_CNT];
	void (*_Fire_constructor)(struct _Fire*);
	void (*_Fire_destructor)(struct _Fire*);
	void (*_Fire_Notify)(struct _Fire*);
	void (*_Fire_AddObserver)(struct _Fire*,void* pElement);
	void (*_Fire_DelObserver)(struct _Fire*,void* pElement);
};

/****************************FUNCTIONS**********************************/
void _Observer_Update(struct _Observer* pThis)
{
	printf("%s\n",pThis->ID);
}

void _Observer_destructor(struct _Observer* pThis)
{
	
}

void _Observer_constructor(struct _Observer* pThis)
{
	memset(pThis->ID,0,sizeof(pThis->ID));
	pThis->_Observer_Update = _Observer_Update;
	pThis->_Observer_destructor = _Observer_destructor;
}

void _Fire_Notify(struct _Fire* pThis)
{
	unsigned short uIter = 0;
	pThis = pThis;
	for( ; uIter < pThis->m_nObserverCnt ; ++uIter)
	{
		(pThis->m_listObservers[uIter])->_Observer_Update(pThis->m_listObservers[uIter]);
	}
}

void _Fire_AddObserver(struct _Fire* pThis,void* pElement)
{
	if(pThis->m_nObserverCnt < MAX_LIST_CNT)
	{
		pThis->m_listObservers[pThis->m_nObserverCnt] = (List)pElement;
		++(pThis->m_nObserverCnt);
	}
	else
	{
		printf("list is full now!\n");
	}
}

void _Fire_DelObserver(struct _Fire* pThis,void* pElement)
{	
	unsigned short uIter = 0;
	unsigned short uInnerIter = 0;	
	for( ; uIter < pThis->m_nObserverCnt ; uIter++)
	{		
		if(pThis->m_listObservers[uIter] == pElement)
		{
			--(pThis->m_nObserverCnt);		
			for(uInnerIter =  uIter; uInnerIter < (pThis->m_nObserverCnt - uIter) ; uInnerIter++)
			{
				pThis->m_listObservers[uInnerIter] = pThis->m_listObservers[uInnerIter + 1];
			}
			pThis->m_listObservers[pThis->m_nObserverCnt] = NULL;
			break;
		}
	}
}

void _Fire_destructor(struct _Fire* pThis)
{

}

void _Fire_constructor(struct _Fire* pThis)
{
	pThis->m_nObserverCnt = 0;
	memset(pThis->m_listObservers,0,sizeof(pThis->m_listObservers));
	pThis->_Fire_Notify = _Fire_Notify;
	pThis->_Fire_AddObserver = _Fire_AddObserver;
	pThis->_Fire_DelObserver = _Fire_DelObserver;
	pThis->_Fire_destructor = _Fire_destructor;
}


int main(void)
{
	printf("init...\n");

	ZERO(_Observer,obs1);
	strcpy(obs1.ID,"MichaelMa");
	ZERO(_Observer,obs2);
	strcpy(obs2.ID,"ZhangZhan");
	ZERO(_Observer,obs3);
	strcpy(obs3.ID,"ChenFeng");
	ZERO(_Observer,obs4);
	strcpy(obs4.ID,"LuoJi");



	ZERO(_Fire,fire);

	fire._Fire_AddObserver(&fire,&obs1);

	fire._Fire_AddObserver(&fire,&obs2);

	fire._Fire_AddObserver(&fire,&obs3);

	fire._Fire_AddObserver(&fire,&obs4);

	fire._Fire_Notify(&fire);
	printf("----------------------------\n");
	fire._Fire_DelObserver(&fire,&obs1);

	fire._Fire_Notify(&fire);

	printf("----------------------------\n");
	fire._Fire_AddObserver(&fire,&obs1);

	fire._Fire_Notify(&fire);

	printf("finished...!\n");

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值