调查者模式(Subject/Observer)
当前位置:以往代写 > C/C++ 教程 >调查者模式(Subject/Observer)
2019-06-13

调查者模式(Subject/Observer)

调查者模式(Subject/Observer)

副标题#e#

界说:工具间的一对多的依赖干系,当一个工具的状态产生改变时,所有依赖于它的工具都获得通知并被自动更新。

成果:搜索数据库,当有需要发布的数据将其用各类方法发送出去。

调查者模式无疑能很好的做到上面的要求,无论要几多种方法,只要增加多个担任之ITransfer接口的派生类即可,有很好的维护性。

以下是实际的应用.

观测者模式(Subject/Observer)


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

}

    关键字:

在线提交作业