#include "stdafx.h"
#include <string>
#include <set>
#include <iostream>
using namespace std;
class CObject;
class CObserver
{
public:
CObserver() {}
virtual ~CObserver() {}
virtual void Update(CObject* object, void* arg = 0) = 0;
};
class CObject
{
public:
CObject(): m_changed(false) {}
virtual ~CObject() {}
void Attach(CObserver* observer)
{
if(!observer)
{
return;
}
m_observer.insert(observer);
}
void Detach(CObserver* observer)
{
if(!observer)
{
return;
}
m_observer.erase(observer);
}
void notifyObserver(void* pArg)
{
if(!hasChanged())
{
return;
}
clearChanged();
set<CObserver*>::iterator iter = m_observer.begin();
for(; iter != m_observer.end(); iter++)
{
(*iter)->Update(this, pArg);
}
}
void setChanged()
{
m_changed = true;
}
bool hasChanged()
{
return m_changed;
}
void clearChanged()
{
m_changed = false;
}
private:
set<CObserver*> m_observer;
bool m_changed;
};
class ConcreteObject: public CObject
{
public:
ConcreteObject() {}
~ConcreteObject() {}
void function(const string name)
{
cout << "ConcreteObject::function" << endl;
setChanged();
notifyObserver(const_cast<char*>(name.c_str()));
}
};
class ConcreteObserver: public CObserver
{
public:
ConcreteObserver(const string& name): m_observer_name(name) {}
~ConcreteObserver() {}
virtual void Update(CObject* object, void* arg /* = 0 */)
{
char* pContent = static_cast<char*>(arg);
if(dynamic_cast<ConcreteObject*>(object))
{
cout << m_observer_name << " updated from ConcreteObject, content: " << pContent << endl;
}
}
private:
string m_observer_name;
};
int _tmain(int argc, _TCHAR* argv[])
{
ConcreteObject* object = new ConcreteObject();
ConcreteObserver* observer = new ConcreteObserver("ConcreteObserver");
object->Attach(observer);
object->function("xixixi");
system("pause");
return 0;
}