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

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

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;
}

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


相关文章
|
2月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
59 3
|
27天前
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
3月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
60 0
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
48 1
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
32 3
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
39 9
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
44 2
|
3月前
|
设计模式 监控 UED
设计模式之观察者模式
【10月更文挑战第12天】 观察者模式是一种行为型设计模式,定义了一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动更新。主要由主题(被观察者)和观察者组成,实现对象间的松耦合,广泛应用于用户界面、事件驱动系统和数据监控等领域。

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    64
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    54
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    61
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    79
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    47
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    81
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    70
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    54
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    63
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    137