观察者模式-c++


 

OOP基础:抽象 封装 多态 继承
OOP原则:封装变化
多用组合, 少用继承
针对接口编程, 不针对实现编程
为交互对象之间的松耦合设计而努力
观察者模式:在对象之间定义一对多的依赖,这样依赖, 当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。


UML类图:

https://img-blog.csdn.net/20131211085641296watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHV0dWJva2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


具体实现:

class Subject{
public:
Subject();
virtual void registerObserver(Observer *temp=0;virtual void removeObserver(Observer *temp=0;virtual void notifyObservers()=0;virtual ~Subject(void);};


#pragma once
#include "subject.h"
#include <list>
#include "Observer.h"
class WeatherData :
	public Subject
{
public:
	WeatherData(void);
	~WeatherData(void);

	void registerObserver(Observer *temp);
	void removeObserver( Observer *temp);
	void notifyObservers();
	void measurementsChanged();
	void setMeasurements(float temper, float humid, float press);
private:
	std::list<Observer *> obeservers;
	float temperature;//温度
	float humidity;//湿度
	float pressure;//压力
};

#include "WeatherData.h"


WeatherData::WeatherData(void)
{
	//obeservers = new std::list<Observer *>;
}


WeatherData::~WeatherData(void)
{
}

void WeatherData::registerObserver( Observer *temp)
{
	obeservers.push_back(temp);
	//obeservers->push_back(temp);
}

void WeatherData::removeObserver( Observer *temp)
{
	obeservers.remove(temp);
}

void WeatherData::notifyObservers()
{
	for(std::list<Observer *>::iterator iter = obeservers.begin(); iter != obeservers.end(); ++iter)
	{
		(*iter)->update(temperature, humidity, pressure);
	}
}

void WeatherData::measurementsChanged()
{
	notifyObservers();
}

void WeatherData::setMeasurements(float temper, float humid, float press)
{
	temperature = temper;
	humidity = humid;
	pressure = press;
	measurementsChanged();
}



//继承  Observer

CurrentConditionsObserver::CurrentConditionsObserver(void)
{
}


CurrentConditionsObserver::~CurrentConditionsObserver(void)
{
}

void CurrentConditionsObserver::display()
{

}
//推送消息这里 可以是 Subject *psubject 然后在内部自己取自己需要的关注的消息,从而达到解耦消息的目的。
void CurrentConditionsObserver::update(float temp, float humidity, float pressure)
{
	std::cout << "CurrentConditionsObserver  current data : temperature = " << temp << " humidity = " << humidity << " pressure = " << pressure << std::endl;
}


//继承 Observer

#pragma once
#include "observer.h"
class CurrentConditinsObserver2 :
	public Observer
{
public:
	CurrentConditinsObserver2(void);
	~CurrentConditinsObserver2(void);
	void update(float temp, float humidity, float pressure);
	void display();
};

void CurrentConditinsObserver2::update(float temp, float humidity, float pressure)
{
	std::cout << "CurrentConditionsObserver2  current data : temperature = " << temp << " humidity = " << humidity << " pressure = " << pressure << std::endl;
}


主函数:

#include "stdafx.h"
#include "Observer.h"
#include "CurrentConditionsObserver.h"
#include "Subject.h"
#include "WeatherData.h"
#include "CurrentConditinsObserver2.h"

int _tmain(int argc, _TCHAR* argv[])
{
	WeatherData WeatherDataTest =  WeatherData();
	Observer *pObserver = new CurrentConditionsObserver();
	WeatherDataTest.registerObserver( pObserver);
	WeatherDataTest.setMeasurements(100,200,300);
	
	WeatherDataTest.removeObserver( pObserver);
	//pObserver = NULL;
	Observer *pObserver2 = new CurrentConditinsObserver2();
	WeatherDataTest.registerObserver(pObserver2);
	WeatherDataTest.setMeasurements(300,400,500);

	delete pObserver;
	delete pObserver2;
	std::cin.get();
	return 0;
}


运行结果:

OK.

<<有时候人并不是缺少方法,而是缺少一往无前的决心!>>



 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值