C++编程模式1--观察者模式

来源:互联网 发布:广西网络培训网 编辑:程序博客网 时间:2024/05/17 22:43

观察者模式用于实现以下功能,有一个观察者类用以发布信息,其他类继承这个观察者类,只订阅自己想要操作的信息。

本例中,GateService.h,GateSevice.cpp文件用以实现观察者类。DlgLogin.h,DlgLogin.cpp文件用以实现订阅信息的类。

具体实现如下:

//GateService.h 文件#pragma onceclass IGateServerRpc{public:    virtual void OnGetMsg(CString pDate){};                     //观察模式:获取消息};typedef std::list<IGateServerRpc*> ObserverList;typedef std::list<IGateServerRpc*>::iterator ObserverListIter;class CGateService{public:    CGateService();    virtual ~CGateService();    void AddObserver(IGateServerRpc *);    void DelObserver(IGateServerRpc *);    void PullData();private:    ObserverList m_listObserver;};
//GateSevice.cpp 文件#include "stdafx.h"#include "GateService.h"CGateService::CGateService(){}CGateService::~CGateService(){}void CGateService::AddObserver(IGateServerRpc * pObserver){    if (pObserver)    {        auto itFind = find(m_listObserver.begin(), m_listObserver.end(), pObserver);        if (itFind==m_listObserver.end())        {            m_listObserver.push_back(pObserver);        }    }}void CGateService::DelObserver(IGateServerRpc *pObserver){    if (pObserver)    {        auto itFind = find(m_listObserver.begin(), m_listObserver.end(), pObserver);        if (itFind != m_listObserver.end())        {            m_listObserver.remove(pObserver);        }    }}void CGateService::PullData(){    if (m_listObserver.size() > 0)    {        auto iter = m_listObserver.begin();        for (; iter != m_listObserver.end(); ++iter)        {            auto pObs = *iter;            if (pObs)            {                pObs->OnGetMsg(_T("观察者模式"));            }        }    }}
//DlgLogin.h 文件#pragma once#include "stdafx.h"#include "GateService.h"//登录窗口class CDlgLogin    : public WindowImplBaseBase    , public IGateServerRpc{public:    CDlgLogin();    virtual ~CDlgLogin();public:    LPCTSTR GetWindowClassName() const;    virtual CStdString GetSkinFile();    virtual CStdString GetSkinFolder();    void Init();protected:    int CreateAgreementDlg();    virtual void OnGetMsg(CString);protected:    virtual void Notify(TNotifyUI& msg);    virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);    CString SetLabelString(const int & code);protected:    void WriteUserPwd(CString userName, CString pwd);    CString strConfigPath;                      //配置文件目录+文件名protected:    bool logInitialCheck(CString &username,CString &pwd);       //用户名密码非空校验private:    CButtonUI*  m_pBtnLogin;    CEditUI*    m_pEdtUserName;    CEditUI*    m_pEdtPwd;    COptionUI*  m_pOptRemberPwd;    COptionUI*  m_pOptAutoLogin;    CEditUI*    m_pLblTipLabel;    CString     m_strUserName;    CString     m_strPassword;    bool        m_boolIsAutoLogin;    CGateService*   m_pGateService;};
// DlgLogin.cpp文件#include "stdafx.h"#include "DlgLogin.h"#include "resource.h"using namespace std;CDlgLogin::CDlgLogin(): m_pBtnLogin(NULL), m_pEdtUserName(NULL), m_pEdtPwd(NULL), m_strUserName(_T("")), m_strPassword(_T("")), m_pGateService(NULL){    m_pGateService = new CGateService();    m_pGateService->AddObserver(this);//**把自己添加到订阅类的列表中**}CDlgLogin::~CDlgLogin(){    if (m_pGateService)    {        m_pGateService->DelObserver(this);        delete m_pGateService;        m_pGateService = NULL;    }}LPCTSTR CDlgLogin::GetWindowClassName() const{    return _T("CDlgLogin");}CStdString CDlgLogin::GetSkinFile(){    return _T("DlgLogin.xml");}CStdString CDlgLogin::GetSkinFolder(){    return _T("");}void CDlgLogin::Init(){    m_pGateService->PullData();//**拉取信息,调用观察者类,使其发布信息**}int CDlgLogin::CreateAgreementDlg(){    return 0;}void CDlgLogin::OnGetMsg(CString content){    CString strContent = content;//**订阅类再次接受信息**}void CDlgLogin::Notify(TNotifyUI& msg){    if (msg.nType == COUI_MSGTYPE_CLICK)    {        //单击消息        if (msg.pSender->GetName() == _T("BtnClose"))        {            ::PostQuitMessage(0);        }    }}LRESULT CDlgLogin::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){    return __super::HandleMessage(uMsg, wParam, lParam);}bool CDlgLogin::logInitialCheck(CString &username, CString &pwd){    if (username == _T(""))    {        m_pLblTipLabel->SetText(_T("请输入用户名"));        return false;    }    else if (pwd == _T(""))    {        m_pLblTipLabel->SetText(_T("请输入密码"));        return false;    }    return true;}
0 0
原创粉丝点击