参考:http://www.cnblogs.com/jiese/archive/2013/07/11/3183635.html
观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
Observer.h
#ifndef _OBSERVER_H_
#define _OBSERVER_H_
#include <string>
#include <list>
using namespace std;
class Subject;
class Observer
{
public:
~Observer();
virtual void Update(Subject*)=0;
protected:
Observer();
private:
};
class ConcreteObserverA : public Observer
{
public:
ConcreteObserverA();
~ConcreteObserverA();
virtual void Update(Subject*);
protected:
private:
string m_state;
};
class ConcreteObserverB : public Observer
{
public:
ConcreteObserverB();
~ConcreteObserverB();
virtual void Update(Subject*);
protected:
private:
string m_state;
};
//主题(被观察者)
class Subject
{
public:
~Subject();
virtual void Notify();
virtual void Attach(Observer*);
virtual void Detach(Observer*);
virtual string GetState();
virtual void SetState(string state);
protected:
Subject();
private:
string m_state;
list<Observer*> m_lst;
};
//
class ConcreteSubjectA : public Subject
{
public:
ConcreteSubjectA();
~ConcreteSubjectA();
protected:
private:
};
class ConcreteSubjectB : public Subject
{
public:
ConcreteSubjectB();
~ConcreteSubjectB();
protected:
private:
};
#endif
Observer.cpp
#include "Observer.h"
#include <iostream>
#include <algorithm>
using namespace std;
Observer::Observer()
{}
Observer::~Observer()
{}
ConcreteObserverA::ConcreteObserverA()
{}
ConcreteObserverA::~ConcreteObserverA()
{}
void ConcreteObserverA::Update(Subject* pSubject)
{
this->m_state = pSubject->GetState();
cout << "The ConcreteObserverA is " << m_state << std::endl;
}
ConcreteObserverB::ConcreteObserverB()
{}
ConcreteObserverB::~ConcreteObserverB()
{}
void ConcreteObserverB::Update(Subject* pSubject)
{
this->m_state = pSubject->GetState();
cout << "The ConcreteObserverB is " << m_state << std::endl;
}
Subject::Subject()
{}
Subject::~Subject()
{}
void Subject::Attach(Observer* pObserver)
{
this->m_lst.push_back(pObserver);
cout << "Attach an Observer\n";
}
void Subject::Detach(Observer* pObserver)
{
list<Observer*>::iterator iter;
iter = find(m_lst.begin(),m_lst.end(),pObserver);
if(iter != m_lst.end())
{
m_lst.erase(iter);
}
cout << "Detach an Observer\n";
}
void Subject::Notify()
{
list<Observer*>::iterator iter = this->m_lst.begin();
for(;iter != m_lst.end();iter++)
{
(*iter)->Update(this);
}
}
string Subject::GetState()
{
return this->m_state;
}
void Subject::SetState(string state)
{
this->m_state = state;
}
ConcreteSubjectA::ConcreteSubjectA()
{}
ConcreteSubjectA::~ConcreteSubjectA()
{}
ConcreteSubjectB::ConcreteSubjectB()
{}
ConcreteSubjectB::~ConcreteSubjectB()
{}
#include "Observer.h"
#include <iostream>
using namespace std;
int main()
{
//简单测试
/*************************
*创建一个观察者和主题,主题中添加观察者,
*当主题变化时,通知观察者
***************************/
Observer *Ba = new ConcreteObserverA();
Subject *Sa = new ConcreteSubjectA();
Sa ->Attach(Ba);
Sa ->SetState("one");
Sa ->Notify(); //通知观察者变化
getchar();
/* Observer* p1 = new ConcreteObserverA();
Observer* p2 = new ConcreteObserverB();
Observer* p3 = new ConcreteObserverA();
Subject* pSubject = new ConcreteSubjectA();
pSubject->Attach(p1);
pSubject->Attach(p2);
pSubject->Attach(p3);
pSubject->SetState("old");
pSubject->Notify();
cout << "-------------------------------------" << endl;
pSubject->SetState("new");
pSubject->Detach(p3);
pSubject->Notify();*/
return 0;
}