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
- C++编程模式1--观察者模式
- 编程基本知识--观察者模式
- 网络编程--观察者模式
- Java观察者模式编程
- 【C++】Chapter10:观察者模式
- Objective C--观察者模式
- Objective C 观察者模式
- 观察者模式(C++)
- Objective C--观察者模式
- c版本观察者模式
- 【C++】观察者模式
- 观察者模式(C++)
- Object-c 观察者模式
- C++:观察者模式
- 观察者模式(C++)
- 【C#】观察者模式案例
- obj-c编程18:多对多的观察者模式
- Android编程:观察者模式设计
- visio 2013 如何制作形状的剪切、联合、组合、拆分、相交、剪除功能
- HADOOP集群搭建
- 线段树+离散[USACO07OPEN]城市的地平线City Horizon
- 使用IntelliJ IDEA的第一个MyBatis Demo
- 去除字符串中最后出现的某个字符串
- C++编程模式1--观察者模式
- 哈弗曼树(最优二叉树)
- PHP自定义函数&数组
- 在Word中添加图或表自动编号与引用功能
- Java内部类的使用小结
- 敏捷开发之Scrum扫盲篇
- 《MySQL必知必会》学习笔记十(增删改语句使用)------掌握部分
- 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
- servlet的一个小项目(二)