您的位置:首页 > 编程语言 > C语言/C++

观察者模式

2014-04-27 17:32 302 查看
观察者模式的特点:

定义对象间的一种一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

更详细一些的说明可以参考以下博文:
http://www.cnblogs.com/gaochundong/p/design_pattern_observer.html http://blog.csdn.net/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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 观察者模式