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. C++对象模型(虽然在GCC下很大的不同,但是先收藏)

    C++对象模型 何为C++对象模型? 部分: 1.        语言中直接支持面向对象程序设计的部分 2.        对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数 ...

  2. Creating Your Own Server: The Socket API, Part 2

    转:http://www.linuxforu.com/2011/09/creating-your-own-server-the-socket-api-part-2/ By Pankaj Tanwar  ...

  3. css文字截取

    给文字设置宽度 text-overflow:ellipsis;  //超出部分用...表示 white-space:nowrap; //禁止换行 overflow:hidden; //超出部分的文字隐 ...

  4. property在括号中应该怎样写

    property 属性的定义,类似于get set assign: 简单的赋值,不更改索引计数 使用assign是针对基础的数据类型,比如NSinterger,CGFloat和c数据类型(int fl ...

  5. uva 10252 - Common Permutation 字符串水题

    题意:給定兩個小寫的字串a與b,請印出皆出現在兩字串中的字母,出現的字母由a~z的順序印出,若同字母出現不只一次,請重複印出但不能超過任一字串中出現的次數.(from Ruby兔) 很水,直接比较输出 ...

  6. spring + Quartz定时任务配置

    <bean id="exportBatchFileTask" class="com.ydcn.pts.task.ExportBatchFileTask"& ...

  7. CSS3实战手册(第3版)(影印版)

    <CSS3实战手册(第3版)(影印版)> 基本信息 原书名:CSS3: The Missing Manual, 3E 作者: David Sawyer McFarland 出版社:东南大学 ...

  8. xe5 android sample 中的 SimpleList 是怎样绑定的

    C:\Users\Public\Documents\RAD Studio\12.0\Samples\FireMonkeyMobile 例子中的绑定方式如下图: 1.拖拽一个listview到界面上,然 ...

  9. css边框阴影问题

    阴影落在下方:box-shadow: 0 3px 5px rgba(0, 0, 0, .2); 阴影落在四周:box-shadow: 0 3px 5px rgba(0, 0, 0, .2), 0 0 ...

  10. 使用Boost asio实现异步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...