设计模式发布订阅

参考 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驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
阿里打赏 微信打赏
原文地址:https://www.cnblogs.com/itdef/p/7456769.html