设计模式之二:观察者模式

这篇具有很好参考价值的文章主要介绍了设计模式之二:观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

假定我们需要为Weather-O-Rama公司建立一个气象站系统,除已有的WeatherData有数据源类,还需要更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。

设计模式之二:观察者模式,设计模式,观察者模式

 1 以下是一个可能的实现

class WeatherData
{
private:
	//实例变量声明

public:
	void measurementsChanged()
	{
		float temp = getTemperature();
		float humidity = getHumidity();
		float pressure = getPressure();

		currentConditionsDisplay.update(temp, humidity, pressure);
		statisticsDisplay.update(temp, humidity, pressure);
		forecastDisplay.update(temp, humidity, pressure);
	}

	float getTemperature() {}
	float getHumidity() {}
	float getPressure() {}
};

上述实现有以下问题存在:

  • 针对具体实现编程,而非针对接口(currentConditionsDisplay都是具体的实例)
  • 针对每个新的布告板,都得修改代码(添加新的布告板到代码中)
  • 无法在运行时动态增删布告板
  • 尚未封装改变的部分(调用几个update的地方)

2 观察者模式

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

设计模式之二:观察者模式,设计模式,观察者模式

主题是具有状态的对象,并且可以控制这些状态。另一方面,观察者使用这些状态,虽然这些状态不属于他们。

观察者模式提供了一种对象设计(设计原则:为了交互对象之间的松耦合设计而努力),让主题和观察者之间松耦合。

主题只知道观察者实现了某个接口,并不需要知道具体的观察者是谁,做了什么动作。同时,我们也可以在运行时增删观察者。

设计模式之二:观察者模式,设计模式,观察者模式

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

class Observer
{
public:
	virtual void update(float temp, float humidity, float pressure) = 0;
};

class DisplayElement
{
public:
	virtual void display() = 0;
};
// WeatherData实现接口

class WeatherData : public Subject
{
private:
	std::vector<Observer*> observers;
	float temprature;
	float humidity;
	float pressure;

public:
	WeatherData()
	{
		observers = new vector<Observer*>();
	}

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

	void removeObserver(Observer* o)
	{
		observers.remove(o);
	}

	void notifyObserver()
	{
		for (Observer* o : observers)
		{
			o->update(temprature, humidity, pressure);
		}
	}

	void measurementsChanged()
	{
		notifyObserver();
	}
};
// 布告板实现Observer接口

// 为什么要保存对Subject的引用呢,构造完后好像并未使用?
// 以后可能想要取消注册,如果有对Subject的引用会比较方便。

class CurrentConditionsDisplay : public Observer, DisplayElement
{
private:
	Subject* weatherData;
	float temprature;
	float humidity;

public:
	CurrentConditionsDisplay(Subject* weatherData)
	{
		this->weatherData = weatherData;
		weatherData->registerObserver(this);
	}

	void update(float temp, float humidity, float pressure)
	{
		this->temprature = temp;
		this->humidity = humidity;
		display();
	}

	void display()
	{
		std::cout << "Temprature:" << temprature << "Humidity:" << humidity << std::endl;
	}
};

除使用上面的“推”方式主动将数据传送给观察者,还可以通过“拉”方式主动拉取数据(可以传递一个主题对象,或者数据对象给update方法,或者从私有变量中提取)。文章来源地址https://www.toymoban.com/news/detail-542326.html

// 主题本身作为变量,可以让观察者知道是哪个主题通知的
update(Observer o) {}

// Java的内置实现有setChanged()方法,可以在更新观察者时具有更多的弹性,比如什么时候可以
// 不更新,什么时候更新

到了这里,关于设计模式之二:观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式——观察者模式

    观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸,报社就是被观察者,订阅者就是观察者,订阅者通过订阅报纸与报社建立联系,而报

    2024年02月15日
    浏览(50)
  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(56)
  • 重温设计模式 --- 观察者模式

    观察者模式 是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色: 观察

    2024年02月13日
    浏览(56)
  • 设计模式——14. 观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含以

    2024年02月07日
    浏览(42)
  • 设计模式(11)观察者模式

    一、概述: 1、定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2、结构图: 实现  调用

    2024年02月11日
    浏览(49)
  • 设计模式之观察者模式

    可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。 从报纸和杂志的订阅说起: 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不

    2024年01月24日
    浏览(51)
  • 设计模式-观察者

    观察者模式是一种广泛应用于软件开发中的行为设计模式,尤其是在面向对象编程(OOP)中。该模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新 在观察者模式中,存在两个主要角色: 主题(Subject) 或 被

    2024年01月22日
    浏览(45)
  • 观察者设计模式

    行为型模式(Behavioral Patterns):这类模式主要关注对象之间的通信。它们 分别是: 职责链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略

    2024年01月24日
    浏览(48)
  • 设计模式:行为型模式 - 观察者模式

    定义: 又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察

    2023年04月22日
    浏览(95)
  • 6.设计模式之观察者模式

    观察者模式 定义了多个对象间的一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并被自动更新 。这种模式又称 发布-订阅模式 、模型-视图模式,是一种 对象行为型模式 。 观察者模式中的四种角色: 抽象主题 (Subject)角色:也叫抽象

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包