观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,用于在对象之间维持一种一对多的依赖关系。当一个对象的状态发生变化时,它的所有依赖者(观察者)都会被自动通知和更新。
观察者模式涉及两个主要角色:
- 主题(Subject):也称为可观察对象(Observable),它是被观察的对象。主题维护了一个观察者列表,并提供了方法来添加、删除和通知观察者。
- 观察者(Observer):观察者是主题所依赖的对象。当主题的状态发生变化时,观察者会收到通知并执行相应的操作。
下面是一个简单的示例,演示了如何使用C++实现观察者模式
点击展开代码段
#include <iostream>
#include <vector>
// 前向声明
class Observer;
// 主题(可观察对象)
class Subject {
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
// 从观察者列表中删除观察者
auto it = std::find(observers.begin(), observers.end(), observer);
if (it != observers.end()) {
observers.erase(it);
}
}
void notify() {
// 通知所有观察者
for (auto observer : observers) {
observer->update();
}
}
private:
std::vector<Observer*> observers;
};
// 观察者
class Observer {
public:
virtual void update() = 0;
};
// 具体观察者
class ConcreteObserver : public Observer {
public:
ConcreteObserver(const std::string& name) : name(name) {}
void update() override {
std::cout << name << " received notification" << std::endl;
}
private:
std::string name;
};
int main() {
// 创建主题和观察者
Subject subject;
ConcreteObserver observer1("Observer 1");
ConcreteObserver observer2("Observer 2");
// 添加观察者到主题
subject.attach(&observer1);
subject.attach(&observer2);
// 主题状态发生变化,通知观察者
subject.notify();
// 删除观察者
subject.detach(&observer2);
// 再次通知观察者
subject.notify();
return 0;
}
在上面的示例中,主题类(Subject)维护了一个观察者列表,并提供了方法来添加(attach)、删除(detach)和通知(notify)观察者的功能。观察者类(Observer)是一个接口类,定义了观察者对象需要实现的方法。具体观察者类(ConcreteObserver)继承自观察者类,并实现了update()方法来定义观察者接收到通知后的行为。
在主函数中,我们创建了一个主题对象(Subject)和两个观察者对象(ConcreteObserver),然后将观察者对象添加到主题对象中。当主题对象的状态发生变化时,它会通知所有的观察者对象进行更新。我们还可以通过detach()方法将某个观察者对象从主题对象中删除,从而停止接收通知。
观察者模式的优点包括解耦、扩展性和灵活性。它允许主题和观察者之间松散耦合,使得它们可以独立地进行变化和扩展。此外,通过添加或删除观察者,我们可以动态地改变系统的行为。
需要注意的是,在实践中可能存在一些细微的差异,具体取决于特定的应用场景。例如,观察者模式还可以支持观察者接收主题的特定状态更新,以便只对感兴趣的状态进行相应的处理。