#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; }