观察者模式

观察者模式的特点:

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

更详细一些的说明可以参考以下博文:

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值