设计模式入门,观察者模式,c++代码实现
// test02.cpp : Defines the entry point for the console application.
//
//设计模式第2章 观察者模式
#include "stdafx.h"
#include <vector>
using namespace std;
class Observer;
class Subject{
public:
virtual void registerObjecet(Observer* o) {};
void removeObserver(Observer o);
void notifyObservers();
};
class Observer
{
public:
virtual void update(float temp,float humidity,float pressure){};
bool operator == (const Observer * d)//重载==
{
return this == d;
}
};
class DisplayElement{
public:
void display();
};
class WeatherData : public Subject
{
private:
vector<Observer*> observers;
vector<Observer*>::iterator iter;
float temperature;
float humidity;
float pressure;
public:
WeatherData(){
}
public:
void registerObjecet(Observer* o)
{
observers.push_back(o);
}
void removeObserver(Observer o)
{
for (iter = observers.begin(); iter != observers.end(); ++iter)
{
if (*iter == &o)
{
observers.erase(iter);
break;
}
}
}
void notifyObservers()
{
for(int i = 0; i < observers.size();i++)
{
Observer* observer = observers[i];
observer->update(temperature,humidity,pressure);
}
}
void measurementsChanged()
{
notifyObservers();
}
void setMeasurements(float temperature,float humidity,float pressure)
{
this->temperature = temperature;
this->humidity = humidity;
this->pressure = pressure;
measurementsChanged();
}
};
class CurrentConditionsDisplay : public Observer,public DisplayElement
{
public:
float temperature;
float humidity;
Subject* weatherData;
public:
CurrentConditionsDisplay(Subject* in_weatherData)
{
this->weatherData = in_weatherData;
in_weatherData->registerObjecet(/*(Observer*)*/this);
}
void update(float temperature,float humidity,float pressure)
{
this->temperature = temperature;
this->humidity = humidity;
display();
}
void display()
{
printf("Current conditions: %f F degrees and %f %% humidity\n",temperature,humidity);
}
};
//weatherStation
int _tmain(int argc, _TCHAR* argv[])
{
WeatherData* weatherData = new WeatherData;
CurrentConditionsDisplay currentDisplay(weatherData);
weatherData->setMeasurements(80,65,30.4f);
weatherData->setMeasurements(82,70,29.2f);
weatherData->setMeasurements(78,90,29.2f);
return 0;
}
设计模式入门,观察者模式,c++代码实现的更多相关文章
- php设计模式之观察者模式实例代码
php提供的两个接口,一个被观察者接口SplSubject,一个或多个观察者接口SPLObserver,和一个可以储存对象的类SplObjectStorage.被观察者有三个方法,需要实现这三个方法, ...
- 设计模式入门,策略模式,c++代码实现
// test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...
- 基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...
- Android使用的设计模式1——观察者模式
设计模式,对程序员来说是一个坎,想在程序员这条路走得更远,设计模式是你的必修课.从大学时代接触GoF到工作几年后重新看设计模式,每次感觉都不一样.这次想借着分析Android Framework源码的 ...
- 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)
学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- php 设计模式之观察者模式(订阅者模式)
php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...
- [JS设计模式]:观察者模式(即发布-订阅者模式)(4)
简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...
- 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?
申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...
随机推荐
- objectARX加载lisp函数、源码的一种方式
//感谢高飞鸟highflybird版主的思路以及研究. //先声明非公开函数acedEvaluateLisp extern int acedEvaluateLisp(const ACHAR*,str ...
- Ionic2:创建App启动页滑动欢迎界面
来自:https://my.oschina.net/qinphil/blog/777787 著作权归原创作者所有,如有再转,请自觉标明原创出处,以示尊重! 摘要: 每个有逼格的App在第一次启动时都有 ...
- linux用到的命令
命令行下利用别名打开ss以及设置相关代理(写到~/.bashrc中使永久有效) #open proxy alias proxystart='gsettings set org.gnome.system ...
- 【关于selenium自动化中,Webdriver的原理以及工作流程】
原文地址:https://www.cnblogs.com/imyalost/p/7242747.html#4109245 作者:老 张 1.关于Webdriver 设计模式:按照Server-Clie ...
- Linux crond任务调度
crond 任务调度 原理图 crontab 进行定时任务的设置,.概述 任务调度:是指系统在某个时间执行的特定的命令或程序. 任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行.如病毒扫描 ...
- js-查找字符串中出现次数最多的字符
假设有一个字符串,下面让我们一起来查找出现次数最多的字符 var str = 'asdfssaaasasasasaa'; 首先,我们定义一个Object用来存放拆分的字符串,然后遍历字符串. 判断ob ...
- [BZOJ 5158][Tjoi2014]Alice and Bob
传送门 \(\color{green}{solution}\) 贪心 /************************************************************** P ...
- Q767 重构字符串
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同. 若可行,输出任意可行的结果.若不可行,返回空字符串. 示例 1: 输入: S = "aab" 输出: &qu ...
- vue-cli 启动过项目步骤
一. 安装 node.js 安装完成后,可以命令行工具中输入 node -v 和 npm -v,如果能显示出版本号,就说明安装成功. 二.安装webpack npm install webpack - ...
- FileZilla上傳報錯:421 There are too many connections from your internet address
起因:2019年01月27日晚九點左右,想要將一個50MB+的文件夾上傳到阿里雲的虛擬主機上,使用FTP 工具FileZilla,出現了上傳一段時間後提示421 There are too many ...