观察者模式介绍-并用C++简单实现

观察者模式介绍

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

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

代码示例

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值