国外设计搜索网站,建网站要,怎么做网页签到,东莞企业网站排名优化文章目录 观察者模式#xff08;Observer Pattern#xff09;概述观察者模式UML图作用#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题#xff08;Subject#xff09;#xff1a;具体主题#xff08;Concrete Subject#xf… 文章目录 观察者模式Observer Pattern概述观察者模式UML图作用实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题Subject具体主题Concrete Subject抽象观察者Observer具体观察者Concrete Observer C 代码示例1C代码示例2 观察者模式Observer Pattern概述
定义 观察者模式又被称作发布 - 订阅模式它是一种行为型设计模式。在这种模式中存在一个被观察的对象主题Subject以及多个对该主题状态变化感兴趣的观察者Observer对象。当主题的状态发生改变时它会主动通知所有已注册的观察者观察者们可以根据收到的通知做出相应的响应从而实现对象之间的一种松耦合的交互关系。
观察者模式定义了一种一对多的依赖关系让多个观察者对象同时监听同一主题对象当这个主题对象发生变化时能够通知到所有观察者使他们能够自动更新自己
观察者模式UML图 作用
实现对象间的解耦
主题对象和观察者对象之间相互依赖的关系比较松散主题只负责在自身状态改变时通知观察者而不用关心观察者具体会做什么操作观察者也只需要关注主题的通知不用了解主题内部状态变化的具体实现细节这样使得它们可以独立地进行修改和扩展降低了代码的耦合度。
支持一对多的依赖关系
一个主题可以有多个观察者关注它的状态变化当主题状态更新时能同时通知到所有相关的观察者方便实现一些需要多方响应的业务场景比如在一个股票交易系统中当某支股票价格变化主题状态改变多个关注该股票的股民客户端观察者都能及时收到通知并做出相应决策。
易于维护和扩展
如果要新增观察者或者改变主题的通知逻辑等相对来说比较容易实现对其他部分的代码影响较小能够灵活应对业务需求的变化。
观察者模式的结构
抽象主题Subject
它定义了注册、移除观察者以及通知观察者等方法的接口维护了一个观察者列表用于记录所有注册的观察者对象当自身状态改变时通过调用通知方法来告知所有观察者。
具体主题Concrete Subject
实现了抽象主题中定义的接口具体管理观察者的注册和移除操作并且在自身内部状态发生变化时按照约定的通知机制去通知所有已注册的观察者。它持有自身实际的业务数据和状态信息。
抽象观察者Observer
定义了一个更新update方法的接口当接收到主题的通知时具体的观察者实现类会通过这个方法来执行相应的业务逻辑以对主题状态变化做出响应。
具体观察者Concrete Observer
实现了抽象观察者中定义的更新方法在该方法中编写具体的业务逻辑明确在收到主题通知后自身要进行的操作比如更新界面显示、进行数据记录等操作。
C 代码示例1
以下是一个简单的基于观察者模式的示例代码模拟一个气象站发布天气数据多个客户端观察者接收并处理天气信息的场景
#include iostream
#include vector// 抽象观察者
class Observer
{
public:virtual void update(float temperature, float humidity, float pressure) 0;
};// 抽象主题
class Subject
{
public:virtual void registerObserver(Observer* o) 0;virtual void removeObserver(Observer* o) 0;virtual void notifyObservers() 0;
};// 具体主题气象站数据
class WeatherData : public Subject
{
private:float temperature;float humidity;float pressure;std::vectorObserver* observers;
public:void registerObserver(Observer* o) {observers.push_back(o);}void removeObserver(Observer* o){for (std::vectorObserver*::iterator it observers.begin(); it! observers.end(); it){if (*it o){observers.erase(it);break;}}}void notifyObservers(){for (std::vectorObserver*::iterator it observers.begin(); it! observers.end(); it){(*it)-update(temperature, humidity, pressure);}}void setMeasurements(float temperature, float humidity, float pressure){this-temperature temperature;this-humidity humidity;this-pressure pressure;notifyObservers();}
};// 具体观察者例如手机客户端显示天气数据
class MobileApp : public Observer
{
private:float temperature;float humidity;float pressure;
public:void update(float temperature, float humidity, float pressure){this-temperature temperature;this-humidity humidity;this-pressure pressure;display();}void display(){std::cout Mobile App: Temperature temperature °C, Humidity humidity %, Pressure pressure hPa std::endl;}
};// 另一个具体观察者网页端显示天气数据
class WebPage : public Observer
{
private:float temperature;float humidity;float pressure;
public:void update(float temperature, float humidity, float pressure){this-temperature temperature;this-humidity humidity;this-pressure pressure;showData();}void showData() {std::cout Web Page: Temperature temperature °C, Humidity humidity %, Pressure pressure hPa std::endl;}
};int main()
{WeatherData weatherData;MobileApp mobileApp;WebPage webPage;weatherData.registerObserver(mobileApp);weatherData.registerObserver(webPage);weatherData.setMeasurements(25.0, 60.0, 1013.0);weatherData.removeObserver(mobileApp);weatherData.setMeasurements(26.0, 55.0, 1015.0);return 0;
}在上述代码中 Observer是抽象观察者规定了update方法接口用于接收主题状态变化的通知并处理。 Subject是抽象主题定义了注册、移除观察者以及通知观察者等相关接口。 WeatherData作为具体主题管理着观察者列表当调用setMeasurements方法改变内部天气数据状态时会通过notifyObservers方法通知所有已注册的观察者。 MobileApp和WebPage是具体观察者实现了update方法在接收到气象站主题的通知后各自通过不同的显示方法display和showData来展示更新后的天气数据。在main函数中演示了观察者的注册、主题状态更新通知以及观察者移除等操作流程体现了观察者模式的基本应用场景。
C代码示例2
//观察者
#includeiostream
#includelist
using namespace std;
//观察者模式Observer又叫发布-订阅模式Publish/Subscribe定义对象间一种一对多的依赖关系
//使得每当一个对象改变状态则所有依赖于它的对象都会得到通知并自动更新class USER
{
public:virtual void Update(){}
};
class USERLI:public USER
{void Update(){cout我是小李我去看华为博客了endl;}
};class USERWANG:public USER
{void Update(){cout我是小王我去看华为博客了endl;}
};class BLOG
{
public:listUSER* m_list;//保存观察者就是关注我博客的用户//记录观察者void AddUser(USER *p_user){m_list.push_back(p_user);}void ReMoveUser(USER *p_user){m_list.remove(p_user);}//开始通知所有我的观察者void NotiFy(){listUSER*::iterator itr m_list.begin();for(;itr!m_list.end();itr){(*itr)-Update();}}
};//华为博客
class BLOG_HUAWEI:public BLOG
{
public:void WriteBlogOk(){NotiFy();}
};int main()
{BLOG_HUAWEI huawei;USERLI *xiaoli new USERLI();USERWANG *xiaowang new USERWANG();huawei.AddUser(xiaowang);huawei.AddUser(xiaoli);huawei.WriteBlogOk();//这个时间点触发通知return 0;
}