博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

callbak_by_sink

Posted on 2015-03-25 15:37  bw_0927  阅读(163)  评论(0)    收藏  举报

 

#ifndef __IUDPCLIENTENGINE_H__
#define __IUDPCLIENTENGINE_H__
#include <boost/shared_ptr.hpp>

//接口类IUDPClientEngine导出的回调接口定义,由继承自IUDPClientEngineSink的具体累实现
class IUDPClientEngineSink
{
public:
	virtual void OnClose() = 0;
	virtual void OnUDPMessage() = 0;  //由具体的类来实现,因为它能决定该如何处理收到的数据
};

//接口类IUDPClientEngine的具体功能接口定义
class IUDPClientEngine
{
public:
	IUDPClientEngine(){} 
	virtual ~IUDPClientEngine() {}
public:
	virtual int SendUDPMessage()=0;
	virtual void AdviseSink(IUDPClientEngineSink * sink)=0;   //安装回调对象
	virtual void UnadviseSink()=0;    //接口类中定义的所有纯虚函数都必须在子类中实现
};
typedef boost::shared_ptr<IUDPClientEngine> IUDPClientEngine_ptr;

class CUDPClientEngineFactory
{
public:
	static IUDPClientEngine_ptr CreateUDPClientEngine();
};

#endif //__IUDPCLIENTENGINE_H__

 

#ifndef __CUDPCLIENTENGINE_H__
#define __CUDPCLIENTENGINE_H__

#include "IUDPClientEngine.h"
#include <boost/shared_ptr.hpp>

//CUDPClientEngine是IUDPClientEngine的实现类
class CUDPClientEngine : public IUDPClientEngine
{
public:
	CUDPClientEngine() {}
	~CUDPClientEngine() {}
public:
	virtual int SendUDPMessage();
	virtual void AdviseSink(IUDPClientEngineSink * sink);  //安装回调对象
	virtual void UnadviseSink() {}
private:
	IUDPClientEngineSink *m_sink;   //回调对象
};

#endif //__CUDPCLIENTENGINE_H__

 

#include "CUDPClientEngine.h"

IUDPClientEngine_ptr CUDPClientEngineFactory::CreateUDPClientEngine()
{
	return IUDPClientEngine_ptr(new CUDPClientEngine());
}

int CUDPClientEngine::SendUDPMessage()
{
	//sendto()
	//recvfrom()


	//取回数据后返回给具体业务类进行处理
	m_sink->OnUDPMessage();
	return 0;
}



void CUDPClientEngine::AdviseSink(IUDPClientEngineSink * sink)
{
	m_sink = sink;
}

 

#include "CUDPClientEngine.h"

IUDPClientEngine_ptr CUDPClientEngineFactory::CreateUDPClientEngine()
{
	return IUDPClientEngine_ptr(new CUDPClientEngine());
}

int CUDPClientEngine::SendUDPMessage()
{
	//sendto()
	//recvfrom()


	//取回数据后返回给具体业务类进行处理
	m_sink->OnUDPMessage();
	return 0;
}



void CUDPClientEngine::AdviseSink(IUDPClientEngineSink * sink)
{
	m_sink = sink;
}

 

#include "ConcreteUDPClient.h"

int main()
{
	ConcreteUDPClient* obj = new ConcreteUDPClient();
	obj->do_normal_job();
	return 0;
}