2.4 NetworkObserver接口实现
有了消息格式作为基础,就可以实现半结构化消息解析器和接口NetworkObserver了。通信层和框架之间的NetworkObserver接口显然是使用了Observer设计模式。
我们先来看它的实现类定义:
class NetworkObserverImpl : public NetworkObserver { public: NetworkObserverImpl(); private: virtual void OnMessage(UserMsgSmartPtr pUserMsg, CommunicationUnitID unitId); virtual void OnLinkDown(CommunicationUnitID unitId); virtual void OnLinkUp(CommunicationUnitID unitId); private: HalfStructuredMessageParser *m_msgParser; // 半结构化消息解析器 private: NetworkObserverImpl(const NetworkObserverImpl&); void operator=(const NetworkObserverImpl&); }; |
默认实现类NetworkObserverImpl包含一个半结构化消息解析器指针,根据当前系统使用的是XML消息格式还是二进制消息格式,该指针指向不同的单例对象:
NetworkObserverImpl::NetworkObserverImpl() { #if defined(_USE_XML_MESSAGE_FORMAT_) m_msgParser = XMLMessageParser::get_instance(); #elif defined(_USE_BINARY_MESSAGE_FORMAT_) m_msgParser = BinMessageParser::get_instance(); #endif // _USE_XML_MESSAGE_FORMAT_ } |
根据图2-2,我们可以画出NetworkObserverImpl::OnMessage()实现函数的序列图:
图2-4 NetworkObserverImpl::OnMessage()序列图
NetworkObserverImpl的各个函数的实现代码如下所示:
void NetworkObserverImpl::OnMessage(UserMsgSmartPtr pUserMsg, CommunicationUnitID unitId) { #ifdef _USE_XML_MESSAGE_FORMAT_ ServiceLayerMessage messageStr((char*)(pUserMsg->begin()), (char*)(pUserMsg->end())); #elif defined(_USE_BINARY_MESSAGE_FORMAT_) ServiceLayerMessage messageStr(pUserMsg->begin(), pUserMsg->end()); #endif
// 调用半结构化消息解析器将流式消息转化为半结构化消息 HalfStructuredMessageSmartPtr psmsg = / m_msgParser->Parse(messageStr); // 调用接口的Parse()函数 if (psmsg == NULL) return;
// 放入分发线程的消息队列中 MessageReceiver* receiver = MessageDispatcherFactory::get_instance(); receiver->ReceiveMessage(psmsg, unitId, pUserMsg); } void NetworkObserverImpl::OnLinkDown(CommunicationUnitID unitId) { // 转换为本地半结构化消息(LOCAL_MESSAGE_LINKDOWN) #ifdef _USE_XML_MESSAGE_FORMAT_ HalfStructuredMessageSmartPtr psmsg(new XMLHalfStructuredMessage()); #elif defined(_USE_BINARY_MESSAGE_FORMAT_) HalfStructuredMessageSmartPtr psmsg(new BinHalfStructuredMessage()); #endif
MessageHeaderSmartPtr pMsgHeader(new MessageHeader); pMsgHeader->SetMessageType(MESSAGE_TYPE_LOCAL); pMsgHeader->SetSource(INVALID_CLIENT_ID); pMsgHeader->SetDestination(INVALID_CLIENT_ID); pMsgHeader->SetSn(0); pMsgHeader->SetMessageID(LOCAL_MESSAGE_LINKDOWN); psmsg->m_msgHeader = pMsgHeader; // 没有消息体 // 放入分发线程的消息队列中 MessageReceiver* receiver = MessageDispatcherFactory::get_instance(); receiver->ReceiveMessage(psmsg, unitId); } void NetworkObserverImpl::OnLinkUp(CommunicationUnitID unitId) { // 转换为本地半结构化消息(LOCAL_MESSAGE_LINKUP) #ifdef _USE_XML_MESSAGE_FORMAT_ HalfStructuredMessageSmartPtr psmsg(new XMLHalfStructuredMessage()); #elif defined(_USE_BINARY_MESSAGE_FORMAT_) HalfStructuredMessageSmartPtr psmsg(new BinHalfStructuredMessage()); #endif
MessageHeaderSmartPtr pMsgHeader(new MessageHeader); pMsgHeader->SetMessageType(MESSAGE_TYPE_LOCAL); pMsgHeader->SetSource(INVALID_CLIENT_ID); pMsgHeader->SetDestination(INVALID_CLIENT_ID); pMsgHeader->SetSn(0); pMsgHeader->SetMessageID(LOCAL_MESSAGE_LINKUP); psmsg->m_msgHeader = pMsgHeader; // 没有消息体 // 放入分发线程的消息队列中 MessageReceiver* receiver = MessageDispatcherFactory::get_instance(); receiver->ReceiveMessage(psmsg, unitId); } NetworkObserverSmartPtr NetworkObserver::CreateObserver() { return (new NetworkObserverImpl); } |
配合图2-2,这些函数实现还是很容易理解的。