:观察者模式--Weather
#ifndef __WEATHER_H__
#define __WEATHER_H__
#include <list>
#include <iostream>
using namespace std; class DisplayElement
{
public:
DisplayElement(){}
virtual ~DisplayElement(){}
virtual void display(){}
};
class Subject; class Observer
{
public:
Observer(){} virtual ~Observer(){} virtual void update(float temp, float humidit, float pressure){} }; class CurrentWeatherDisplay:public Observer, public DisplayElement
{
private:
float temperature;
float humidity;
float pressure;
Subject *weatherData; public:
CurrentWeatherDisplay(Subject *wd); virtual ~CurrentWeatherDisplay(){} virtual void CurrentWeatherDisplay::display()
{
std::cout << "This is Current" << temperature << " " << humidity << " " << pressure << endl;
} virtual void CurrentWeatherDisplay::update(float temp, float hum, float pres)
{
temperature = temp;
humidity = hum;
pressure = pres;
display();
} }; #endif
#ifndef __SUBJECT_H__
#define __SUBJECT_H__
#include <list>
#include <iostream>
#include "Observer.h" using namespace std; class Subject
{
public:
Subject(){} virtual ~Subject(){} virtual void registerObserver(Observer *obs){} virtual void removeObserver(Observer *obs){} virtual void notifyObserver(){}
}; class WeatherData : public Subject
{
private:
std::list<Observer*>observer;
float temperature;
float humidity;
float pressure;
public:
WeatherData(){}
virtual ~WeatherData(){} virtual void registerObserver(Observer *obs){ observer.push_back(obs); } virtual void removeObserver(Observer *obs) { observer.remove(obs);} virtual void notifyObserver()
{
std:list<Observer *>::iterator it = observer.begin();
for (; it != observer.end(); it++)
{
(*it)->update(temperature, humidity, pressure);
}
} void measurementsChanged(){ notifyObserver();} void setMeasurements(float temp, float hum, float pre)
{
temperature = temp;
humidity = hum;
pressure = pre;
measurementsChanged();
}
}; CurrentWeatherDisplay::CurrentWeatherDisplay(Subject *wd)
{
weatherData = wd;
weatherData->registerObserver(this);
} #endif
#include <iostream>
#include "Subject.h"
using namespace std;
int main()
{
WeatherData *wd = new WeatherData();
CurrentWeatherDisplay * cu = new CurrentWeatherDisplay(wd);
wd->setMeasurements(10, 20, 30);
wd->setMeasurements(20, 40, 80);
wd->setMeasurements(100, 200, 300);
return 0;
}
:观察者模式--Weather的更多相关文章
- 观察者模式(一)--《Head First DesignPattern》
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会受到通知并且自动更新. 我们先看下类图: 首先我们自己创建Subject接口,定义了注册观察者,移除观察者和通知 ...
- 观察者模式(二)--《Head First DesignPattern》
我们用Java中自带的观察者模式接口来重写前面的例子. 先看一下类图: 这里用到了一个setChanged函数,它用来标记状态已经改变的事实,好让notifyObservers()知道当它调用时就应该 ...
- HeadFirst设计模式之观察者模式
一.什么是观察者模式 观察者模式定义了一系列对象间一对多的关系,当主题对象的状态发生变化时,会通知所有观察者 二.自定义观察模式 1. 2. package headfirst.designpatte ...
- OOP设计模式[JAVA]——02观察者模式
观察者模式 观察者模式的设计原则 为交互对象之间的松耦合设计而努力,使对象之间的相互依赖降到最低. 观察者模式也是对象行为型模式,其意图为:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 读书笔记之 - javascript 设计模式 - 观察者模式
在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式是一种管理人与其任务(确切的讲,是对象及其行为和状态之间的关系)之间的关系的得力工具.用javascript的话来讲,这种模式的实 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 观察者模式的程序实例C++
一.什么是观察者模式 Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种.Observer模式是行为模式之中的一个,它的作用是当一个对象的状态发生变化时,可以自己主动通知其它 ...
- headfirst设计模式(2)—观察者模式
定义 观察者模式(有时又被称为发布(publish)-订阅(Subscribe)模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察 ...
随机推荐
- 目前用到的一些os.path方法
这里主要记录下os.path.join()的用法 目录结构如下 在readconfig.py中进行试验,如下 1.使用os.path.realpath(__file__)获取文件所在目录 import ...
- legend2---开发日志2(注释和函数比较好的写法)
legend2---开发日志2(注释和函数比较好的写法) 一.总结 一句话总结: 函数用_接意群 注释的关键字用[]括起来 注释的步骤用中文的步骤二字 1.为何以步骤为名写注释? 结构非常清晰 //步 ...
- 关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中
说明:spark版本:2.2.0 hive版本:1.2.1 需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spar ...
- Python基础之文件的基本操作
概述:文件的基本操作1.open 打开文件 f = open("xxx",mode="r",encoding="utf-8") #常用形式 ...
- 关于AndroidStudio混淆配置,简单的整理(转)
1.首先需要在app下的build.gradle下配置,true表示编译时会混淆代码<span style="font-size:18px;">buildTypes { ...
- 牛客寒假算法基础集训营6 I-wzoi
题目链接 分析:这个题本质上可以看成是一个括号匹配题,因为当出现00和11的时候,毫无疑问是前一天看题,后一天写题,这样可以得到最大的得分10 将全部00和11删掉后,就是交替出现的01串了 代码如下 ...
- flexbox与grid layout的区别
flexbox是一种针对一维的局部布局,以轴为核心的弹性布局. grid layout是二维的更加全面的网格布局,
- mysql使用sql语句根据经纬度计算距离排序
CREATE TABLE `locationpoint` ( `id` int(11) NOT NULL, `province` varchar(20) NOT NULL, `city` varcha ...
- python-flask-路由匹配源码分析
@app.route('/') def hello_world(): return 'Hello World!' 第1步: class Flask(_PackageBoundObject): def ...
- python-day1笔记
# 1.编程语言的作用及与操作系统和硬件的关系:#编程语言就是人与电脑之间沟通的介质. # 2.应用程序->操作系统->硬件:#应用程序通过操作系统来控制计算机硬件. #3. cpu-&g ...