观察者模式介绍
观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并进行相应的更新。
观察者模式的应用非常广泛,比如在图形界面编程中,当用户对界面进行操作时,界面需要对其进行相应的更新;在发布订阅模式中,观察者模式可以作为订阅者的实现方式;在事件驱动编程中,观察者模式可以用来处理事件的响应等等。
代码示例
#include <iostream>
#include <vector>
#ifdef _WIN32
#if !defined(__PRETTY_FUNCTION__)
#define __PRETTY_FUNCTION__ __FUNCSIG__
#endif
#endif
class Subject;
class Observer{
public:
virtual void update(Subject* subject) = 0;
protected:
std::string _title;
};
class Subject{
public:
void attach(Observer* observer){
_observers.push_back(observer);
}
void detach(Observer* observer){
for(auto iter = _observers.begin();
iter != _observers.end(); ++iter)
{
if(*iter == observer){
_observers.erase(iter);
break;
}
}
}
void notify(){
for(auto observer : _observers){
observer->update(this);
}
}
private:
std::vector<Observer*> _observers;
};
class ConcreteObserver : public Observer{
public:
ConcreteObserver(const std::string & title){
_title = title;
}
void update(Subject* subject) override{
std::cout << __PRETTY_FUNCTION__ << " " << _title.c_str() << " update observer" << std::endl;
}
};
int main(int argc, char* argv[])
{
Subject subject;
ConcreteObserver observer("dog"), observer2("cat");
subject.attach(&observer);
subject.attach(&observer2);
subject.notify();
subject.detach(&observer);
subject.detach(&observer2);
return 0;
}
在上面的例子中,Subject类表示被观察者,可以通过attach()方法向其中添加观察者,detach()方法从其中移除观察者,notify()方法通知所有观察者。Observer类表示观察者,其中update()方法用于接收被观察者的通知并进行相应的处理。ConcreteObserver类是Observer类的具体实现。在main函数中,我们先向Subject中添加一个观察者,然后通过notify()方法通知所有观察者,最后再将观察者从Subject中移除。