调查者模式(Subject/Observer)
副标题#e#
界说:工具间的一对多的依赖干系,当一个工具的状态产生改变时,所有依赖于它的工具都获得通知并被自动更新。
成果:搜索数据库,当有需要发布的数据将其用各类方法发送出去。
调查者模式无疑能很好的做到上面的要求,无论要几多种方法,只要增加多个担任之ITransfer接口的派生类即可,有很好的维护性。
以下是实际的应用.
#p#副标题#e#
//接口
//ITransfer.h
#pragma once
class ITransfer
{
public:
virtual bool DoTransfer(...) = 0;
};
//FetionTransfer.h
#pragma once
#include "Transfer.h"
class CFetionTransfer:public ITransfer
{
public:
CFetionTransfer();
~CFetionTransfer();
bool DoTransfer(...);
private:
......
};
//MailTransfer.h
#pragma once
#include "Transfer.h"
class CMailTransfer: public ITransfer
{
public:
CMailTransfer();
~CMailTransfer();
bool DoTransfer(...);
private:
....
};
//TransferPool.h
#pragma once
#include "Transfer.h"
#include <vector>
using namespace std;
class CTransferPool
{
private:
vector<ITransfer*> vo;
public:
virtual ~CTransferPool();
void Login(ITransfer* po);
void Logout(ITransfer* po);
//向各成员广播动静
void Notify(...);
};
//TransferPool.cpp
#include "TransferPool.h"
CTransferPool::~CTransferPool()
{
vector<ITransfer*>::iterator vi = vo.begin();
for (; vi != vo.end(); vi++)
{
if(*vi)
{
delete *vi;
*vi = NULL;
}
}
}
void CTransferPool::Login(ITransfer* po)
{
vo.push_back(po);
}
void CTransferPool::Logout(ITransfer* po)
{
vector<ITransfer*>::iterator vi = vo.begin();
for (; vi != vo.end(); vi++)
{
if (*vi == po)
vo.erase(vi);
}
}
void CTransferPool::Notify(...)
{
vector<ITransfer*>::iterator vi = vo.begin();
for (; vi != vo.end(); vi++)
{
ITransfer *s = *vi;
(*vi)->DoTransfer(...);
}
}
void main
{
CTransferPool*m_pTranPool= new CTransferPool();
CFetionTransfer *m_pFetionTran = new CFetionTransfer(...);
CMailTransfer *m_pMailTran = new CMailTransfer(...);
m_pTranPool->Login(m_pFetionTran);
m_pTranPool->Login(m_pMailTran);
while(需要发送动静)
{
m_pTranPool->Notify();
}
//释放
if(m_pTranPool)
{
delete m_pTranPool;
m_pTranPool = NULL;
}
}