WeatherData.h

 #ifndef WEATHERDATA_H_INCLUDED
#define WEATHERDATA_H_INCLUDED #include <set>
#include "Display.h" class WeatherData
{
public:
void measurementsChanged();
void registerObserver( Display *p_display );
void removeObserver( Display *p_display ); private:
int getTemperature() { return ; }
int getHumidity() { return ; }
int getPressure() { return ; } std::set<Display *> m_p_displays;
}; #endif // WEATHERDATA_H_INCLUDED

WeatherData.cpp

 #include "WeatherData.h"

 void WeatherData::measurementsChanged()
{
for ( std::set<Display *>::iterator it = m_p_displays.begin(); it != m_p_displays.end(); it++ )
{
(*it)->update( getTemperature(), getHumidity(), getPressure() );
}
} void WeatherData::registerObserver( Display *p_display )
{
m_p_displays.insert( p_display );
} void WeatherData::removeObserver( Display *p_display )
{
m_p_displays.erase( p_display );
}

Display.h

 #ifndef DISPLAY_H_INCLUDED
#define DISPLAY_H_INCLUDED class Display
{
public:
virtual void update( int temp, int humidity, int pressure ) = ;
}; #endif // DISPLAY_H_INCLUDED

CurrentConditionsDisplay.h

 #ifndef CURRENTCONDITIONSDISPLAY_H_INCLUDED
#define CURRENTCONDITIONSDISPLAY_H_INCLUDED #include <iostream>
#include "Display.h" class CurrentConditionsDisplay : public Display
{
public:
void update( int temp, int humidity, int pressure ) { std::cout << "CurrentConditionsDisplay " << temp << "-" << humidity << "-" << pressure << std::endl; }
}; #endif // CURRENTCONDITIONSDISPLAY_H_INCLUDED

StatisticsDisplay.h

 #ifndef STATISTICSDISPLAY_H_INCLUDED
#define STATISTICSDISPLAY_H_INCLUDED #include <iostream>
#include "Display.h" class StatisticsDisplay : public Display
{
public:
void update( int temp, int humidity, int pressure ) { std::cout << "StatisticsDisplay " << temp << "-" << humidity << "-" << pressure << std::endl; }
}; #endif // STATISTICSDISPLAY_H_INCLUDED

ForcastDisplay.h

 #ifndef FORCASTDISPLAY_H_INCLUDED
#define FORCASTDISPLAY_H_INCLUDED #include <iostream>
#include "Display.h" class ForcastDisplay : public Display
{
public:
void update( int temp, int humidity, int pressure ) { std::cout << "ForcastDisplay " << temp << "-" << humidity << "-" << pressure << std::endl; }
}; #endif // FORCASTDISPLAY_H_INCLUDED

main.cpp

 #include "WeatherData.h"
#include "CurrentConditionsDisplay.h"
#include "StatisticsDisplay.h"
#include "ForcastDisplay.h" int main()
{
WeatherData weather_data; CurrentConditionsDisplay current_conditions_display;
StatisticsDisplay statistics_display;
ForcastDisplay forcast_display; weather_data.registerObserver( &current_conditions_display );
weather_data.registerObserver( &statistics_display );
weather_data.registerObserver( &forcast_display ); weather_data.measurementsChanged(); weather_data.removeObserver( &statistics_display ); weather_data.measurementsChanged(); return ;
}

Headfirst设计模式的C++实现——观察者模式(Observer)的更多相关文章

  1. HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)

    观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...

  2. headfirst设计模式(2)—观察者模式

    定义 观察者模式(有时又被称为发布(publish)-订阅(Subscribe)模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察 ...

  3. [Android&amp;Java]浅谈设计模式-代码篇:观察者模式Observer

    观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]

      1   2{<HeadFirst设计模式>之观察者模式 }   3{ 主题与观察者                    }   4{ 编译工具 :Delphi7.0          ...

  5. 【HeadFirst 设计模式总结】2 观察者模式

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.我们需要理解报社.订阅系统和订报人之间的关系,订报人通过订阅系统订报,一旦报社有新的报纸,订阅系统就会派人送 ...

  6. 设计模式之十:观察者模式(Observer)

    观察者模式: 在对象之间定义了一种一对多的依赖关系.当一个对象改变它的状态时,全部依赖它的对象会自己主动接收通知并更新自己的状态. Define a one-to-many dependency be ...

  7. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  8. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  9. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

随机推荐

  1. oc-20-多态

    /** 为什么父类可以访问子类继承自父类的方法,但是无法访问子类独有的方法? 1.编译器编译时: 编译器在编译时,只检查指针变量的类型,确定该指针变量类型里面有下面调用的方法,如果有该方法,编译器就认 ...

  2. Redis 管道技术

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  3. Java再学习——Executor,ExecutorService,ScheduledExecutorService与Executors

    1,Executor.ExecutorService和ScheduledExecutorService,它们都是接口,它们的关系是ScheduledExecutorService继承ExecutorS ...

  4. 1.5.2 什么是Analyzer--分析器

    分析器检查字段的文本,然后生成一个token流.在schema.xml中,分析器作为<fieldType>的一个子元素.在普通的使用当中,只有字段类型solr.TextField使用分析器 ...

  5. jQuery实现轮播图效果

    通过改变背景色来达到效果,有下角标和左右箭头,都已经实现. html部分: <!DOCTYPE html> <html> <head> <meta chars ...

  6. [课程相关]homework-06

    一.c++11 lambda /* * File: main.cpp * Author: liangjie * * Created on 2013年11月23日, 下午12:02 */ #includ ...

  7. Java中创建操作文件和文件夹的工具类

    Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...

  8. 转 【O2O案例】汽车后市场垂直化电子商务:平业模式解析

    核心提示:一.商业模式简介.汽车后市场垂直化电子商务是我在2010年初开始筹划,起因是在淘宝工作期间运营汽车类目后遇到很多问题无决,由于 一.商业模式简介. 汽车后市场垂直化电子商务是我在2010年初 ...

  9. html使用空格对齐文本(&nbsp;&emsp;&ensp;)

    字符以及HTML实体 描述以及说明   这是我们使用最多的空格,也就是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个).要使用html实体表示才可累加. ...

  10. Quartz.net官方开发指南系列篇

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...