#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
typedef int STATE;
class Observer;
class Subject;
class Subject
{
public:
Subject(){}
void Notify();
void Attach(Observer *pObserver);
void Detach(Observer *pObserver);
protected:
list<Observer*> m_ListObserver;
};
class Observer
{
public:
Observer(){}
virtual void Update(Subject* pSubject)=0;
};
class ConcreateSubject: public Subject
{
public:
ConcreateSubject():SubjectState(-1){}
STATE GetState()
{
return SubjectState;
}
void SetState(STATE nState)
{
this->SubjectState = nState;
}
private:
STATE SubjectState;
};
class ConcreateObserver : public Observer
{
public:
ConcreateObserver() : ObserverState(-1){}
virtual void Update(Subject* pSubject)
{
if(!pSubject)
return;
//m_subject= new ConcreateSubject();
m_subject = (ConcreateSubject *)pSubject;
ObserverState=m_subject->GetState();
cout << "The ObeserverState is " << ObserverState << endl;
}
private:
ConcreateSubject *m_subject;
STATE ObserverState;
};
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);
}
}
int main()
{
Observer *p1 = new ConcreateObserver();
Observer *p2 = new ConcreateObserver();
ConcreateSubject* 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;
}
对象行为模式——观察者模式(Observer)
最新推荐文章于 2024-03-19 09:46:04 发布