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. what is docker

    尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来. 官网的介绍是这样的: Docker is an open platfo ...

  2. app 性能优化的那些事

    来源:树下的老男孩 链接:http://www.jianshu.com/p/5cf9ac335aec iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功 ...

  3. WPF 之 后台设置Image的Souce

    后台动态设置Image的Souce. 方法一: BitmapImage imgSource = new BitmapImage(new Uri("location",UriKind ...

  4. C# 之 反射

    一.反射的定义: 审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等, System.Reflection ...

  5. 1.7.6 Highlighting-高亮

    1 高亮 solr的高亮允许匹配用户查询的文档的片段包含在查询响应中返回,高亮包含在返回结果的单独部分(highlighting部分). solr提供了一个高亮工具的集合,这个工具允许控制大量字段的片 ...

  6. IOS plist轻量级操作

    plist,全名PropertyList,即属性列表文件,它是一种用来存储串行化后的对象的文件.这种文件,在ios开发过程中经常被用到.这种属性列表文件的扩展名为.plist,因此通常被叫做plist ...

  7. 7. Android框架和工具之 android-percent-support-lib-sample(百分比支持)

    1. android-percent-support-lib-sample介绍: 谷歌最新的百分比布局库的示例项目.其实LinearLayout的layout_weight也能实现百分比效果,不过这个 ...

  8. .net对各表的操作详细到字段的更改记录的日志

    存入数据库中,目前的字段包括操作人,操作时间,sql语句,被修改的字段,字段原值,操作人的身份. /// <summary> /// 添加操作日志 /// </summary> ...

  9. [转]poll技术

    poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函数的声明: #include <poll.h> int poll(struct ...

  10. eclipse添加hadoop开发插件

    在开发hadoop的时候去查找了一下eclipse marketplace是没有找到hadoop的插件,上网又找了一下发现原来hadoop中其实是带有这样的插件的, 其实很简单只要将这个插件复制到ec ...