观察者模式(Observer Pattern)是一种软件设计模式,属于行为型模式的一种。它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,会通知所有观察者对象,使它们能够自动更新自己的状态。
观察者模式的主要角色包括:
观察者模式的工作原理如下:
观察者模式的优点包括:
观察者模式的缺点包括:
总之,观察者模式是一种简单而实用的设计模式,它可以帮助降低对象之间的耦合度,实现数据的共享和同步,同时也需要注意其可能带来的性能问题。在实际应用中,需要根据具体情况选择合适的设计模式,以满足不同的需求。
以下是一个简单的 C++版本的观察者模式示例代码:
#include
#include
using namespace std;
// 主题类
class Subject {
public:
virtual void attach(Observer* obs) {
observers_.push_back(obs);
}
virtual void detach(Observer* obs) {
observers_.erase(find(observers_.begin(), observers_.end(), obs));
}
virtual void notify() {
for (Observer* obs : observers_) {
obs->update();
}
}
private:
vector<Observer*> observers_;
};
// 观察者类
class Observer {
public:
virtual void update() = 0;
};
// 具体的观察者类 1
class Observer1 : public Observer {
public:
void update() override {
cout << "Observer1 got notified." << endl;
}
};
// 具体的观察者类 2
class Observer2 : public Observer {
public:
void update() override {
cout << "Observer2 got notified." << endl;
}
};
int main() {
Subject sub;
Observer1 obs1;
Observer2 obs2;
sub.attach(&obs1);
sub.attach(&obs2);
sub.notify(); // 主题发生变化,通知所有观察者
sub.detach(&obs1);
sub.notify(); // 主题发生变化,通知剩余的观察者
return 0;
}
在上述示例中,Subject类是主题类,它维护了一个观察者列表observers_,可以注册和注销观察者对象。Observer类是观察者类,它是一个抽象类,需要子类实现update方法来处理主题对象的变化。Observer1和Observer2是具体的观察者类,它们分别实现了update方法来处理主题对象的变化。
在示例中,我们创建了一个主题对象sub和两个观察者对象obs1和obs2,并注册了这两个观察者对象到主题对象中。然后,主题对象发生了一个变化,并通知了所有观察者对象。观察者对象收到通知后,调用update方法根据主题对象的变化更新自己的状态。
最后,我们注销了obs1观察者对象,并再次通知主题对象发生变化。由于obs1已经被注销,所以它不会收到通知,只有obs2会收到通知并更新自己的状态。
这只是一个简单的示例,实际应用中,主题对象和观察者对象可能会更加复杂,并且可能需要处理多个事件和多个观察者对象。同时,也需要注意处理主题对象和观察者对象之间的耦合度,以避免引入不必要的复杂性。