// 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++代码实现的更多相关文章

  1. php设计模式之观察者模式实例代码

    php提供的两个接口,一个被观察者接口SplSubject,一个或多个观察者接口SPLObserver,和一个可以储存对象的类SplObjectStorage.被观察者有三个方法,需要实现这三个方法, ...

  2. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  3. 基于java的设计模式入门(1)——为什么要学习设计模式

    大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...

  4. Android使用的设计模式1——观察者模式

    设计模式,对程序员来说是一个坎,想在程序员这条路走得更远,设计模式是你的必修课.从大学时代接触GoF到工作几年后重新看设计模式,每次感觉都不一样.这次想借着分析Android Framework源码的 ...

  5. 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

    学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...

  6. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  7. php 设计模式之观察者模式(订阅者模式)

    php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...

  8. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  9. 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...

随机推荐

  1. win10安装express遇到的问题。

    昨天在centos上成功安装了express,今天想在win10上面装一个,死活安装不了 express可以正常安装,但是每次安装express-generator的时候一直报错 659 silly ...

  2. 2016级算法第二次上机-C.AlvinZH的儿时梦想——坦克篇

    872 AlvinZH的儿时梦想----坦克篇 思路 简单题.仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过.那么我们只要知道每一行矩形之间的空隙位置就可以了. 如果这里用二维数组记住每一 ...

  3. 接口自动化之unittest+ddt

    我在上一篇(https://www.cnblogs.com/wlyhy/p/10083318.html) 文章整理了unittest的模板,但在后续学习中,发现还有许多值得优化的地方.例如在我们设计测 ...

  4. kamctl start

    尽管没有吃饭,胃酸,九点半,,,还是挺高兴的.只截图不说话. 这个问题弄得我好烦啊.几个小时...网罗了国外几个论坛都没有解.我还没有想到这就不是问题,,,多试多试 再看看moni 也没什么意思,就是 ...

  5. cookie session token详解

    cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...

  6. module.exports,exports,export和export default,import与require区别与联系

    还在为module.exports.exports.export和export default,import和require区别与联系发愁吗,这一篇基本就够了! 一.首先搞清楚一个基本问题: modu ...

  7. Part 1: Setting up ARM GNU tool chain

    ARM Build Tools GNU Tools for ARM Embedded Processors. GNU Make for Windows. GNU Tools for ARM Embed ...

  8. python namedtuple命名元组

    from collections import namedtuple Animal=namedtuple('Animal','name age type') perry=Animal(name='pe ...

  9. mysql 03

    CREATE TABLE class(    empno INT,    ename VARCHAR(4),    job VARCHAR(4),    mgr INT,    hiredate DA ...

  10. eclipse中点不出方法的解决办法

    window-preferences-java-editor-Content Assist-Advanced 然后选中右上方的所有 右下方选中一个即可.