观察者模式的特点:
定义对象间的一种一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
更详细一些的说明可以参考以下博文:
http://www.cnblogs.com/gaochundong/p/design_pattern_observer.html
http://blog.youkuaiyun.com/u013757555/article/details/23241481
自己也实现一个。主要包括2块:观察者和被观察者的基类、观察者的实现类。
//Observer.h
#ifndef OBSERVER_PATTERN_H
#define OBSERVER_PATTERN_H
#pragma once
#include <string>
#include <set>
class CObserver
{
public:
CObserver(void){}
virtual ~CObserver(void){}
virtual void Update(const std::string & observable, const std::string & doSomething)=0;
};
class CObservable
{
public:
CObservable(void){}
virtual ~CObservable(void){}
virtual bool AddObserver(CObserver & o);
virtual bool RmvObserver(CObserver & o);
virtual void SetName(const std::string & strName){m_strName = strName;}
virtual std::string GetName(void){return m_strName;}
virtual void DoSomething(const std::string & strState);
protected:
std::set<CObserver*> m_setObserver;
std::string m_strState;
std::string m_strName;
virtual void NotifyObservers(void);
};
#endif
//Observer.cpp
#include "Observer.h"
bool CObservable::AddObserver(CObserver & o)
{
m_setObserver.insert(&o);
return true;
}
void CObservable::NotifyObservers(void)
{
std::set<CObserver*>::iterator it = m_setObserver.begin();
for (; it != m_setObserver.end(); ++it)
{
(*it)->Update(m_strName,m_strState);
}
}
bool CObservable::RmvObserver(CObserver & o)
{
std::set<CObserver*>::iterator it = m_setObserver.find(&o);
if (it == m_setObserver.end())
return false;
m_setObserver.erase(it);
return true;
}
void CObservable::DoSomething(const std::string & strState)
{
m_strState = strState;
NotifyObservers();
}
//ObserverImpl.h
#ifndef OBSERVER_PATTERN_IMPL_H
#define OBSERVER_PATTERN_IMPL_H
#pragma once
#include "observer.h"
#include <iostream>
class CObserverImpl : public CObserver
{
public:
CObserverImpl(void)
{
}
virtual ~CObserverImpl(void)
{
}
virtual void Update(const std::string & observable, const std::string & doSomething)
{
std::cout<< observable << " " << doSomething << std::endl;
}
};
#endif
调用示例
// main.cpp
#include "stdafx.h"
#include "ObserverImpl.h"
int _tmain(int argc, _TCHAR* argv[])
{
CObserverImpl observerA;
CObservable o;
o.SetName("被观察者");
o.AddObserver(observerA);
o.DoSomething("Hello world.");
system("pause");
return 0;
}