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