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

📄 subject.cpp

📁 在Windows和VxWorks平台下,观察者模式C++实用实现.
💻 CPP
字号:
////////////////////////////////////////////////
// Filename: Subject.cpp
// Function: 
// Author: ShaoxiongLi
// Date: 2008年8月28日
// Project: xxxMain
// Remarks:  	  
// History:  	 
////////////////////////////////////////////////



#include "stdafx.h"
#include "Observer.h"
#include "Subject.h"



// 构造函数
Subject::Subject( void ) : m_observers( NULL )
{
	m_observers = new ObserverList( );	
}



// 拷贝构造函数
Subject::Subject( const Subject & rhsSubject ) : m_observers( NULL )
{
	m_observers = new ObserverList( );
}



// 析构函数
Subject::~Subject( void )
{
	list< Observer * >::iterator it;	
	
	if ( !m_observers->empty( ) ) 
	{
		for ( it = m_observers->begin( ); it != m_observers->end( ); it++ )
		{
			// 通知观察者目标对象将析构
			(*it)->SubjectDestructe( *this );
		}
	}

	delete m_observers;
}



// 判断是否重复注册
bool Subject::RepeatAttach ( Observer & observer )
{
	list< Observer * >::iterator it;
	bool bRepeat = FALSE;

	if ( &observer == NULL )
	{
		// 空观察者视为重复注册
		bRepeat = TRUE;
	}
	else
	{
		bRepeat = FALSE;
	}
	
	// 判断是否重复注册
	if ( !m_observers->empty( ) ) 
	{
		for ( it = m_observers->begin( ); it != m_observers->end( ) && ( !bRepeat ); it++ )
		{
			if ( (*it) == &observer )
			{
				bRepeat = TRUE;
			}
		}
	}

	return bRepeat;
}



// 增加观察者
void Subject::Attach( Observer & observer )
{		
	if ( !RepeatAttach( observer ) )
	{
		// 添加新观察者
		m_observers->push_back( &observer );

		// 通知观察者目标对象已添加
		observer.SubjectNotify( *this );
	}
}



// 删除观察者
void Subject::Detach( Observer & observer )
{
	if ( &observer != NULL )
	{
		m_observers->remove( &observer );
	}
}



// 通知观察者
void Subject::Notify( IN char * message, IN int msgLen )
{
	list< Observer * >::iterator it;

	if ( !m_observers->empty( ) )
	{
		for ( it = m_observers->begin( ); it != m_observers->end( ); it++ )
		{
			(*it)->Update( *this, message, msgLen );
		}
	}
}



// 通知观察者
void Subject::OnTimer( IN int nTimer )
{
	list< Observer * >::iterator it;
	bool recycle;
	
	recycle = FALSE;
	
	if ( !m_observers->empty( ) )
	{
		// 通知定时事件
		for ( it = m_observers->begin( ); it != m_observers->end( ); it++ )
		{
			(*it)->OnTimer( *this, nTimer );
		}
	}	
}

⌨️ 快捷键说明

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