[设计模式] --- 观察者模式

简介: [设计模式] --- 观察者模式

1 观察者模式介绍

观察者模式适用于当一个对象的状态发生变化时,需要通知其他多个对象做出相应的响应和处理的场景。这种情况通常发生在多个对象之间存在依赖关系的情况下,通过观察者模式可以实现对象之间的解耦和灵活性,让对象之间的通信更加有效和方便。

2 简单示例

以下是一个使用C++实现的简单观察者模式示例代码:

#include <iostream>
#include <vector>
#include <algorithm>
// 抽象观察者类
class Observer {
public:
    virtual void update() = 0;
};
// 具体观察者类
class ConcreteObserver : public Observer {
public:
    ConcreteObserver(std::string name) : m_name(name) {}
    void update() override {
        std::cout << m_name << " received the update message." << std::endl;
    }
private:
    std::string m_name;
};
// 抽象主题类
class Subject {
public:
    virtual void attach(Observer* observer) = 0;
    virtual void detach(Observer* observer) = 0;
    virtual void notify() = 0;
};
// 具体主题类
class ConcreteSubject : public Subject {
public:
    void attach(Observer* observer) override {
        m_observers.push_back(observer);
    }
    void detach(Observer* observer) override {
        for (auto it = m_observers.begin(); it != m_observers.end(); ++it) {
            if (*it == observer) {
                m_observers.erase(it);
                break;
            }
        }
    }
    void notify() override {
        for (auto observer : m_observers) {
            observer->update();
        }
    }
private:
    std::vector<Observer*> m_observers;
};
int main() {
    // 创建具体主题对象和观察者对象
    ConcreteSubject subject;
    ConcreteObserver observer1("Observer1");
    ConcreteObserver observer2("Observer2");
    // 注册观察者对象
    subject.attach(&observer1);
    subject.attach(&observer2);
    // 发送更新消息,通知观察者对象
    subject.notify();
    // 取消注册观察者对象
    subject.detach(&observer2);
    // 再次发送更新消息,通知观察者对象
    subject.notify();
    return 0;
}

运行结果:

Oberserver1 received the update message.
Oberserver2 received the update message.
Oberserver1 received the update message.

在上面的代码中,抽象观察者类和抽象主题类提供了观察者和主题之间的接口,具体观察者类和具体主题类实现了这些接口并提供了具体的实现。在主函数中,创建了一个具体主题对象和两个具体观察者对象,将观察者对象注册到主题对象中,通过主题对象发送更新消息,通知观察者对象进行相应的处理,同时也演示了如何取消注册观察者对象的操作。

3 项目应用代码示例

观察者模式在汽车软件行业中的应用场景很多,例如当汽车的各种传感器(如温度、湿度、速度、转速等)检测到数据变化时,需要通知其他相关的模块(如车载娱乐、导航系统等)作出相应的响应和处理。另外,观察者模式还可以用于汽车自动驾驶系统中,例如当车辆检测到前方有障碍物时,需要通知自动驾驶控制器进行相应的调整。

以下是一个使用C++实现的简单观察者模式示例代码,模拟汽车传感器检测数据变化并通知其他相关模块作出响应:

#include <iostream>
#include <vector>
// 抽象观察者类
class Observer {
public:
    virtual void update() = 0;
};
// 具体观察者类
class NavigationSystem : public Observer {
public:
    void update() override {
        std::cout << "NavigationSystem update: change route" << std::endl;
    }
};
// 抽象主题类
class Sensor {
public:
    virtual void attach(Observer* observer) = 0;
    virtual void detach(Observer* observer) = 0;
    virtual void notify() = 0;
};
// 具体主题类
class SpeedSensor : public Sensor {
public:
    void attach(Observer* observer) override {
        m_observers.push_back(observer);
    }
    void detach(Observer* observer) override {
        for (auto it = m_observers.begin(); it != m_observers.end(); ++it) {
            if (*it == observer) {
                m_observers.erase(it);
                break;
            }
        }
    }
    void setData(int speed) {
        m_speed = speed;
        notify();
    }
private:
    std::vector<Observer*> m_observers;
    int m_speed;
    void notify() override {
        for (auto observer : m_observers) {
            observer->update();
        }
    }
};
int main() {
    // 创建具体主题对象和观察者对象
    SpeedSensor speedSensor;
    NavigationSystem navigationSystem;
    // 注册观察者对象
    speedSensor.attach(&navigationSystem);
    // 模拟传感器检测到数据变化,并通知观察者对象
    speedSensor.setData(80);
    // 取消注册观察者对象
    speedSensor.detach(&navigationSystem);
    // 再次模拟传感器检测到数据变化,并通知观察者对象
    speedSensor.setData(60);
    return 0;
}

在上面的代码中,抽象观察者类和抽象主题类提供了通用的接口,具体观察者类和具体主题类实现了自己的业务逻辑。当传感器检测到速度数据变化时,会通知观察者对象(如导航系统)作出相应的处理。


目录
相关文章
|
4月前
|
设计模式 监控 安全
设计模式 | 观察者模式
设计模式 | 观察者模式
21 0
|
4月前
|
设计模式 前端开发 数据中心
设计模式之观察者模式
设计模式之观察者模式
|
5月前
|
设计模式 存储 Java
认真学习设计模式之观察者模式(Observer Pattern)
认真学习设计模式之观察者模式(Observer Pattern)
32 0
|
3月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
25天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
2月前
|
设计模式 存储 Java
【设计模式】观察者模式
【设计模式】观察者模式
|
9天前
|
设计模式 消息中间件 存储
【设计模式系列笔记】观察者模式
观察者模式是一种设计模式,它允许一个对象(主题)维护一组依赖于它的对象(观察者)并在状态发生变化时通知它们。这种模式属于行为型模式。在观察者模式中,主题是被观察的对象,而观察者是依赖于主题的对象,当主题的状态发生变化时,所有注册的观察者都会得到通知并自动更新。
19 0
|
5月前
|
设计模式 存储 Java
Java设计模式【二十】:观察者模式
Java设计模式【二十】:观察者模式
27 0
|
23天前
|
设计模式 Java
23种设计模式,观察者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
24 2
|
2月前
|
设计模式 前端开发
观察者模式--设计模式
观察者模式--设计模式
10 0