zoukankan      html  css  js  c++  java
  • 设计模式发布订阅

    参考 http://blog.csdn.net/calmreason/article/details/50895191

    主要是发布者存储订阅者的指针 发布时依次NOTIFY 发送信息

    订阅者在订阅时将自己加入到发布者的容器中

    使用C++11 的智能指针

    需要注意智能指针的 weak shared的转换 以及订阅者析构后的对应操作

    代码

    // MyDesignPattern.cpp: 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <string>
    #include <memory>
    #include <vector>
    
    using namespace std;
    
    
    class Observer;
    
    class Blog {
    public:
        Blog() {
            std::cout << "Blog()" << std::endl;
        }
    
        ~Blog(void) {
            std::cout << "~Blog()" << std::endl;
        }
    
        void set_name(const std::string& name) {
            name_ = name;
        }
        const string get_name() {
            return name_;
        }
        void set_status(const std::string&s) {
            status_ = s;
        }
        const std::string get_status(void)const {
            return this->status_;
        }
        void add_observer(const std::shared_ptr<Observer>& pobserver)
        {
            observers_.push_back(pobserver);
        }
    
        void notify(void);
    
    private:
        std::string name_;
        std::string status_;
        std::vector<std::weak_ptr<Observer>> observers_;
        typedef std::vector<std::weak_ptr<Observer>>::iterator iter;
    };
    
    
    class Observer
    {
    public:
        //由于只能指针都是值语义的,所以使用常值引用可以减少复制  
        Observer(const string& name, const std::shared_ptr<Blog>& pblog)
            :name_(name), blog_(pblog)
        {
            cout << "Observer(" << name_ << ")订阅了" << blog_.lock()->get_name() << endl;
        }
        ~Observer(void)
        {
            cout << "~Observer(" << name_ << ")" << endl;
        }
        void update(void)
        {
            std::cout << name_ << "知道了" << blog_.lock()->get_name() << blog_.lock()->get_status() << endl;
        }
    private:
        string name_;
    
        std::weak_ptr<Blog> blog_;
    };
    
    void Blog::notify(void)
    {
        iter i = observers_.begin();
        //标准写法  
        while (i != observers_.end())
        {
            //weak_ptr本身不具备访问能力(单一职责),都是通过shared_ptr来实现  
            std::shared_ptr<Observer> pobserver(i->lock());
            //判断对象是否已经析构  
            if (pobserver)
            {
                pobserver->update();
                //迭代器在这里前进  
                ++i;
            }
            //已经析构的对象不再引用  
            else
            {
                i = observers_.erase(i);
            }
        }
    }
    
    
    
    
    int main()
    {
        std::shared_ptr<Blog> pblog(new Blog());
        pblog->set_name("CalmReason CSDN Blog");
    
        std::shared_ptr<Observer> pobserver1(new Observer("张三",pblog));
        std::shared_ptr<Observer> pobserver2(new Observer("李四", pblog));
    
        pblog->add_observer(pobserver1);
        pblog->add_observer(pobserver2);
    
        pblog->set_status("发表了博客:c++的内存管理");
        pblog->notify();
    
        pblog->set_status("发表了博客:weak_ptr的基本用法");
        pblog->notify();
    
    
        return 0;
    }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    HDU1041
    HDU1005
    HDU1231
    MYSQL入门总结
    oracle性能问题排查~记一个单实例的问题
    mysql案例~关于mysql的配置文件个人见解
    数据恢复系列~恢复方案制定
    mysql架构解读~mysql的多源复制
    mysql 案例~select引起的性能问题
    遭遇Bad version number in .class file
  • 原文地址:https://www.cnblogs.com/itdef/p/7456769.html
Copyright © 2011-2022 走看看