设计模式之观察者模式

参考资料:
https://zhuanlan.zhihu.com/p/119308881

观察者模式,又称为发布-订阅模式

举例:我们经常使用微信,每天都能收到各种自己关注的公众号推送来的消息文章。
这就是一个典型的发布订阅模式。我们关注了某个公众号,就相当于给公众号粉丝列表添加了一个用户,当公众号推送消息时,发布的消息推送给所有的粉丝,粉丝就可以收到这些消息。

自己的理解:该设计模式就是利用多态性对子类对象进行无差别管理,添加和通知等,利用微信的公众号订阅和发布文章比较好理解!

结合这些理解,代码不难实现,如下非线程安全版本:

#pragma once

#include <iostream>
#include <list>
#include <algorithm>

namespace sub_obs
{
    class observer{ // 观察者基类
        private:
            int state;
        public:
            observer(){}
            virtual ~observer(){}
            
            virtual int getState(){
                return state;
            }

            virtual void setState(int state){
                this->state = state;
            }

            virtual void update() = 0;
    };

    class obj1 : public observer{ // 观察者1
        public:
            void update() override{
                std::cout << "obj1 update, state is " << getState() << std::endl;
            }
    };

    class obj2 : public observer{ // 观察者2
        public:
            void update() override{
                std::cout << "obj2 update, state is " << getState() << std::endl;
            }
    };

    class subject{ // 该类为发布者,将所有观察者保存在一个集合中
        private:
            std::list<observer*> obj_list; // 用于管理订阅者
        public:
            void add(observer* obs){
                obj_list.push_back(obs);
            }

            void notify(observer* obs){
                auto iter = std::find(obj_list.begin(), obj_list.end(), obs);
                if(iter != obj_list.end()){
                    (*iter)->setState(12);
                    (*iter)->update();
                }
            }

            void notify(){
                for(auto ite : obj_list){
                    ite->setState(34);
                    ite->update();
                }
            }
    };
} // namespace sub_obs

进行简单测试:

#include "base.hpp"

int main(){
    sub_obs::subject sub;
    sub_obs::obj1 *obj1 = new sub_obs::obj1;
    sub_obs::obj2 *obj2 = new sub_obs::obj2;

    sub.add(obj1);
    sub.add(obj2);

    sub.notify(obj1);

    sub.notify();
    return 0;
}

结果:

obj1 update, state is 12
obj1 update, state is 34
obj2 update, state is 34
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值