参考:http://www.cnblogs.com/jiese/archive/2013/07/11/3183635.html
定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
#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()
{}
mian.cpp
#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;
}
现象: