首页 > 其他分享 >HeadFirst设计模式-观察者模式

HeadFirst设计模式-观察者模式

时间:2022-11-16 14:37:50浏览次数:55  
标签:HeadFirst include string Observer void 观察者 observers 设计模式 data

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。

 

 

 

Java代码

 

c++代码

#pragma once

#include "Observer.h"

class Subject
{
public:
    virtual void registerObserver(Observer* o) = 0;
    virtual void removeObserver(Observer* o) = 0;
    virtual void notifyObserver() = 0;
};

//-----------------------------------------
#pragma once
#include <iostream>
#include <string>

using namespace std;

class Observer
{
public:
    virtual void update(string arg) = 0;
};


//-----------------------------------------
#pragma once
#include "Observer.h"
#include "Subject.h"
class CurrentConditionsDisplay :
    public Observer
{
    Subject* subject;
public:

    CurrentConditionsDisplay(Subject* sub)
    {
        subject = sub;
        subject->registerObserver(this);
    }

    ~CurrentConditionsDisplay()
    {
    }

    void update(string arg)
    {
        
        cout << "CurrentConditionsDisplay arg:" << arg << '\n';
    }
};


//-----------------------------------------
#pragma once
#include "Observer.h"
#include "Subject.h"

class ForecastDisplay :
    public Observer
{
    Subject* subject;
public:

    ForecastDisplay(Subject* sub)
    {
        subject = sub;
        subject->registerObserver(this);
    }

    ~ForecastDisplay()
    {
    }

    void update(string arg)
    {
        cout << "ForecastDisplay arg:" << arg << '\n';
    }
};


//-----------------------------------------
#pragma once
#include "Observer.h"
#include "Subject.h"

class StatisticsDisplay :
    public Observer
{
    Subject* subject;
public:

    StatisticsDisplay(Subject* sub)
    {
        subject = sub;
        subject->registerObserver(this);
    }

    ~StatisticsDisplay()
    {
    }

    void update(string arg)
    {
        cout << "StatisticsDisplay arg:" << arg << '\n';
    }
};


//-----------------------------------------
#pragma once
#include "Subject.h"
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class WeatherData :
    public Subject
{
    string temperature;
    string humidity;
    string pressure;

    vector<Observer*> observers;
public:

    WeatherData()
    {
    }

    ~WeatherData()
    {
    }

    void registerObserver(Observer* o)
    {
        observers.push_back(o);
    }

    void removeObserver(Observer* o)
    {
        observers.erase(remove(observers.begin(), observers.end(), o));
    }

    void notifyObserver()
    {
        for (int i = 0; i < observers.size(); i++)
        {
            Observer* pObj = observers.at(i);
            string arg = this->temperature + ";" + this->humidity + ";" + this->pressure;
            pObj->update(arg);
        }
    }


    void measurementsChanged() {
        notifyObserver();
    }

    void setMeasurements(float temperature, float humidity, float pressure) {
        this->temperature = to_string(temperature);
        this->humidity = to_string(humidity);
        this->pressure = to_string(pressure);
        measurementsChanged();
    }

};


//-----------------------------------------
#include <iostream>
#include "CurrentConditionsDisplay.h"
#include "ForecastDisplay.h"
#include "StatisticsDisplay.h"
#include "WeatherData.h"

using namespace std;

int main()
{
    WeatherData data;
    
    CurrentConditionsDisplay d1(&data);
    ForecastDisplay d2(&data);
    StatisticsDisplay d3(&data);

    data.setMeasurements(13.2, 23, 31);
    data.setMeasurements(15.2, 28, 71);
    data.removeObserver(&d2);
    data.setMeasurements(17.2, 21, 61);

    return 0;
}
//-----------------------------------------
View Code

 

 

****

标签:HeadFirst,include,string,Observer,void,观察者,observers,设计模式,data
From: https://www.cnblogs.com/htj10/p/16895798.html

相关文章

  • 软件设计模式白话文系列(九)装饰者模式
    1、描述通过把对象引入包含行为的特殊封装中来为对象增强功能的模式。2、模式结构与实现逻辑具体业务类:这个类的对象就是需要被装饰者模式加强的对象。需要实现抽象装......
  • Spring框架中都用到了哪些设计模式 ?
    1.简单工厂模式简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得......
  • 设计模式之【建造者模式】使用java建造者模式优雅创建对象
    文章目录​​什么是建造者模式​​​​一步一步认清建造者模式​​​​1、传统方式创建对象​​​​2、建造者模式创建对象​​​​建造者模式优缺点​​​​建造者模式适用......
  • 软件设计模式白话文系列(八)桥接模式
    软件设计模式白话文系列(八)桥接模式1、描述把一个事物的多个维度剥离出来,通过组合方式来达到灵活设计的目的,Java中,我们一般是通过对象引用来替换继承关系,从而将抽象和实......
  • C++设计模式-(创建模式)原型模式
     原型模式主要用于复制当前对象的副本 #include<iostream>classanimal{public:virtual~animal(){}virtualvoideat(){std::cout......
  • 软件设计模式白话文系列(七)适配器模式
    1、描述适配器模式顾名思义就是将某个类的接口转换成客户端期望的另一个接口表示。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。2、适用性客户端需要调用现......
  • 设计模式学习(二十四):Spring 中使用到的设计模式
    设计模式学习(二十四):Spring中使用到的设计模式作者:Grey原文地址:博客园:设计模式学习(二十四):Spring中使用到的设计模式CSDN:设计模式学习(二十四):Spring中使用到的设计模式......
  • 模板设计模式
    对于模板方法,最好使用final关键字进行修饰。 那么,final修饰变量,又分为两种情况。 一,修饰基本数据类型其值不能被更改 二,修饰引用数据类型其地址值不能被更改,但......
  • 设计模式学习(二十三):中介模式
    设计模式学习(二十三):中介模式作者:Grey原文地址:博客园:设计模式学习(二十三):中介模式CSDN:设计模式学习(二十三):中介模式中介模式中介模式是一种行为型模式。举个简单的例子......
  • 【设计模式】以国足的例子来解释代理模式,希望自己不要被退钱
    文章目录​​1代理模式​​​​1.1代理模式的解释​​​​1.2代理模式的四个对象​​​​2例子​​​​2.1释义​​​​2.2代码​​​​2.3效果图​​​​3静态代理......