// Observer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
typedef int STATE;
class Observer;
class Subject
{
public:
Subject() : m_nSubjectState(-1){}
virtual ~Subject();
void Notify();
void Attach(Observer *pObserver);
void Detach(Observer *pObserver);
virtual void SetState(STATE nState);
virtual STATE GetState();
protected:
STATE m_nSubjectState;
list<Observer*> m_ListObserver;
};
class Observer
{
public:
Observer() : m_nObserverState(-1){}
virtual ~Observer(){}
virtual void Update(Subject* pSubject) = 0;
protected:
STATE m_nObserverState;
};
class ConcreateSubject
: public Subject
{
public:
ConcreateSubject() : Subject(){}
virtual ~ConcreateSubject()
{
}
virtual void SetState(STATE nState);
virtual STATE GetState();
};
class ConcreateObserver : public Observer
{
public:
ConcreateObserver() : Observer(){}
virtual ~ConcreateObserver(){}
virtual void Update(Subject* pSubject);
};
void Subject::Attach(Observer *pObserver)
{
cout<<"Attach an Observer"<<endl;
m_ListObserver.push_back(pObserver);
}
void Subject::Detach(Observer *pObserver)
{
std::list<Observer*>::iterator iter;
iter =find(m_ListObserver.begin(), m_ListObserver.end(), pObserver);
if (m_ListObserver.end() != iter)
{
m_ListObserver.erase(iter);
cout << "Detach an Observer"<<endl;
}
else
{
cout<<"No this Observer,so cannot detach it"<<endl;
}
}
void Subject::Notify()
{
cout<<"Notify to all observers"<<endl;
list<Observer*>::iterator iter;
for (iter= m_ListObserver.begin();iter!= m_ListObserver.end();iter++)
{
(*iter)->Update(this);
}
}
void Subject::SetState(STATE nState)
{
m_nSubjectState = nState;
}
STATE Subject::GetState()
{
return m_nSubjectState;
}
Subject::~Subject()
{
std::list<Observer*>::iterator iter, temp;
for (iter= m_ListObserver.begin(); iter!= m_ListObserver.end();)
{
temp = iter;
++iter;
delete (*temp);
}
m_ListObserver.clear();
}
void ConcreateSubject::SetState(STATE nState)
{
std::cout << "SetState By ConcreateSubject/n";
m_nSubjectState = nState;
}
STATE ConcreateSubject::GetState()
{
std::cout << "GetState By ConcreateSubject/n";
return m_nSubjectState;
}
void ConcreateObserver::Update(Subject* pSubject)
{
if (NULL == pSubject)
return;
m_nObserverState = pSubject->GetState();
std::cout << "The ObeserverState is " << m_nObserverState << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Observer *p1 = new ConcreateObserver();
Observer *p2 = new ConcreateObserver();
Subject* p = new ConcreateSubject();
p->Attach(p1);
p->Attach(p2);
p->SetState(8);
p->Notify();
p->Detach(p1);
p->SetState(10);
p->Notify();
delete p;
return 0;
}