⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractobserver.cpp

📁 自定义的增加观察者的封装类,可以直接继承来使用
💻 CPP
字号:
#include "stdafx.h"
#include "../Include/AbstractObserver.h"
#include "../Include/DbgInfoLog.h"
 
// For Consoles's Update--zgy [10/16/2003]
/************************************************************************/
/* CObserver                                                            */
/************************************************************************/

void CObserver::Update(CSubject* theChangeSub)
{
	m_iAccumulateAlter++;
}

void CObserver::AddSubject(CSubject *pSubject)
{
	m_listSubject.push_back(pSubject);
}

void CObserver::DelSubject(CSubject *pSubject)
{
	m_listSubject.remove(pSubject);
}

// 观察者自身将被删除,清理所有与之相关联的目标
void CObserver::ClearAll()
{
	for (std::list<CSubject *>::iterator iter=m_listSubject.begin();
		!(iter == m_listSubject.end()); 
		iter = m_listSubject.begin()) // 因为在DelObserver里删除了*iter,不能再用++iter
	{
		(*iter)->DelObserver(this);
	}
}

/************************************************************************/
/* CSubject                                                             */
/************************************************************************/
void CSubject::AddObserver(CObserver *pObserver)
{
	m_listObserver.push_back(pObserver);
	pObserver->AddSubject(this);

	if (NULL != m_pChangeManager)
	{
		m_pChangeManager->Register(this, pObserver);
	}
}

void CSubject::DelObserver(CObserver *pObserver)
{
	m_listObserver.remove(pObserver);
	pObserver->DelSubject(this);

	if (NULL != m_pChangeManager)
	{
		m_pChangeManager->Unregister(this, pObserver);
	}
}

void CSubject::Notify()
{
	for(std::list<CObserver *>::iterator iter = m_listObserver.begin(); !(iter == m_listObserver.end()); ++iter)
	{
		(*iter)->Update(this);
	}
}

void CSubject::NotifyManager()
{
	if (NULL != m_pChangeManager)
	{
		m_pChangeManager->Notify(this);
	}
}

void CSubject::PreNotify(DWORD dwUserData)
{

}

void CSubject::PostNotify(DWORD dwUserData)
{

}

void CSubject::ClearAll()
{
	for (std::list<CObserver *>::iterator iter=m_listObserver.begin();
	!(iter == m_listObserver.end()); 
	iter = m_listObserver.begin())
	{
		DelObserver(*iter);
	}
}

CChangeManager::~CChangeManager()
{
	for (std::map< CSubject *, std::list< CObserver * >* >::iterator iter = m_mapSubjectObserver.begin();
				!(iter == m_mapSubjectObserver.end()); ++iter)
	{
		delete (*iter).second;
	}
}

void CChangeManager::Register(CSubject *pSubject, CObserver *pObserver)
{
	if (0 == m_mapSubjectObserver.count(pSubject))
	{
//		m_mapSubjectObserver.insert(std::map< CSubject *, std::list< CObserver * >* >::value_type(pSubject, (new std::list< CObserver * >)/*->push_back(pObserver)*/));
		m_mapSubjectObserver[pSubject] = new std::list< CObserver * >;/*->push_back(pObserver)*/
	}

	m_mapSubjectObserver[pSubject]->push_back(pObserver);
}

void CChangeManager::Unregister(CSubject *pSubject, CObserver *pObserver)
{
	if (0 == m_mapSubjectObserver.count(pSubject))
	{
		STRACE(_T("ERR: Unregister wrong Subject\n"));

		return ;
	}

	m_mapSubjectObserver[pSubject]->remove(pObserver);
}

void CChangeManager::Notify(CSubject *pSubject)
{
	if (0 == m_mapSubjectObserver.count(pSubject))
	{
		STRACE(_T("ERR: Notify but no console?\n"));
 
//		return ;
	}
	
	PreNotify(pSubject);
	pSubject->Notify();
	PostNotify(pSubject);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -