观察者模式介绍

观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并进行相应的更新。

观察者模式的应用非常广泛,比如在图形界面编程中,当用户对界面进行操作时,界面需要对其进行相应的更新;在发布订阅模式中,观察者模式可以作为订阅者的实现方式;在事件驱动编程中,观察者模式可以用来处理事件的响应等等。

代码示例

#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中移除。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐