观察者模式(Observer Pattern)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现分布式事件处理系统。
模式特点
1、 解耦:观察者模式将观察者与被观察者解耦,使得两者之间的依赖关系最小化;
2、 动态响应:当被观察对象的状态改变时,所有观察者对象都会被通知并更新;
3、 灵活性:可以在运行时动态地添加或移除观察者;
4、 扩展性:观察者模式支持广播通信,所有注册的观察者都会收到通知;
适用场景
1、 事件驱动系统:如GUI应用中的事件监听机制;
2、 订阅-发布系统:如新闻系统、消息队列等;
3、 模型-视图-控制器(MVC)架构:当模型数据改变时,视图应该自动更新;
4、 跨系统通知:如多个系统之间的数据同步;
C++案例
以下是一个简单的观察者模式的C++实现:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // 添加该头文件以使用 std::remove
// 观察者接口
class Observer {
public:
virtual void update(const std::string &message) = 0;
virtual ~Observer() = default;
};
// 具体观察者类
class ConcreteObserver : public Observer {
private:
std::string name;
public:
ConcreteObserver(const std::string &name) : name(name) {}
void update(const std::string &message) override {
std::cout << "Observer " << name << " received message: " << message << std::endl;
}
};
// 主题类
class Subject {
private:
std::vector<Observer*> observers;
public:
void addObserver(Observer *observer) {
observers.push_back(observer);
}
void removeObserver(Observer *observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notifyObservers(const std::string &message) {
for (Observer *observer : observers) {
observer->update(message);
}
}
};
// 主函数
int main() {
Subject subject;
ConcreteObserver observer1("A");
ConcreteObserver observer2("B");
subject.addObserver(&observer1);
subject.addObserver(&observer2);
subject.notifyObservers("Hello, Observers!");
subject.removeObserver(&observer1);
subject.notifyObservers("Observer A is removed.");
return 0;
}
运行结果:
Observer A received message: Hello, Observers!Observer B received message: Hello, Observers!Observer*B*received*message:*Observer*A*is*removed.
案例说明:
-
Observer(观察者接口)
Observer
是一个纯虚类(接口),定义了一个 update
方法,所有具体的观察者类必须实现这个方法。当被观察的对象状态发生变化时,会调用这个方法通知观察者。
-
ConcreteObserver(具体观察者类)
ConcreteObserver
实现了 Observer
接口,并包含一个字符串成员变量 name
用于标识观察者。当主题对象通知观察者时,update
方法会输出收到的消息以及观察者的名称。
-
Subject(主题类)
Subject
类管理多个观察者对象。它提供 addObserver
方法来添加观察者,removeObserver
方法来移除观察者,notifyObservers
方法来通知所有观察者。当主题状态发生变化时,它会调用每个观察者的 update
方法来通知他们。
-
主函数
在主函数中,创建了一个 Subject
对象和两个 ConcreteObserver
对象,并将观察者添加到主题中。通过调用 notifyObservers
方法,主题可以通知所有注册的观察者;当一个观察者被移除后,它将不再接收到通知。
总结
观察者模式提供了一种对象与对象之间的松耦合关系,使得一个对象状态改变时能够自动通知并更新相关依赖对象。这种模式的优点包括解耦、动态响应和扩展性,但在对象数量较多时可能会有性能问题。在实际开发中,观察者模式广泛应用于事件驱动系统、订阅-发布系统和MVC架构等场景中。
END
今天是日更的第23/100天
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: