设计模式之观察者模式

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

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

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

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

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

#pragma once

#include 
#include 
#include 

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

你可能感兴趣的:(设计模式,设计模式,观察者模式)