设计模式发布订阅

参考 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;
}

时间: 2024-12-08 17:09:39

设计模式发布订阅的相关文章

javascript 设计模式 -- 发布/订阅模式

直接上代码: index.html : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>设计模式</title> </head> <body> <div id="box"> <div>{{message}}</div> <

[转] 浅析JavaScript设计模式——发布-订阅/观察者模式

前一段时间一直在写CSS3的文章 一直都没写设计模式 今天来写写大名鼎鼎观察者模式 先画张图 观察者模式的理解 我觉得还是发布-订阅模式的叫法更容易我们理解 (不过也有的书上认为它们是两种模式……) 这就类似我们在微信平台订阅了公众号 当它有新的文章发表后,就会推送给我们所有订阅的人 我们可以看到例子中这种模式的优点 我们作为订阅者不必每次都去查看这个公众号有没有新文章发布, 公众号作为发布者会在合适时间通知我们 我们与公众号之间不再强耦合在一起.公众号不关心谁订阅了它, 不管你是男是女还是宠物

设计模式 - 发布-订阅者模式

1.发布-订阅者 设计模式 定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知 观察者模式和发布订阅模式区别 观察者模式是由具体目标(发布者/被观察者)调度的,而发布/订阅模式是由独立的调度中心进行调度,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会:可以说发布订阅模式是观察者模式进一步解耦,在实际中被大量运用的一种模式 ** 观察者模式 ** 1.定义/解析 目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更

设计模式-发布订阅模式(javaScript)

1. 前言 2. 什么是发布订阅模式 3. 发布订阅优缺点 4. 举例 4. 总结 1. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发布者只需做好发布功能,至于订阅者是谁,订阅者做了什么事情,发布者是无需关心的 2. 什么是发布订阅模式 发布订阅:是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在.同样的,订阅者可以表达

理解《JavaScript设计模式与开发应用》发布-订阅模式的最终版代码

最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线空间功能和命名空间功能,以达到先发布再订阅的功能和防止名称冲突的效果.但是令人感到遗憾的是最终代码并没有给出足够的注释.这让像我一样的小白就感到非常的困惑,于是我将这份最终代码仔细研究了一下,并给出了自己的一些理解,鉴于能力有限,文中观点可能并不完全正确,望看到的大大们不吝赐教,谢谢! 下面是添加了个人注释的

设计模式--观察者模式(发布订阅模式)

观察者模式又叫做发布—订阅模式,是我们最常用的设计模式之一.它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知和更新. 观察者模式提供了一个订阅模型,其中对象订阅事件并在发生时得到通知,这种模式是事件驱动的编程基石,它有利益于良好的面向对象的设计. 从上面的话语我们可以得知,观察者模式主要动力是促进形成松散耦合(解耦). 设计思路: 首先先声明一个观察者对象 // 注册观察者对象 var Observer = (function (){ var Oms

js 设计模式:观察者和发布订阅模式

总是把这两个当作同一个模式,但其实是不太一样的,现在重温一下. 观察者模式 观察者直接订阅目标,当目标触发事件时,通知观察者进行更新 简单实现 class Observer { constructor(name) { this.name = name; } update() { console.log(`${this.name} update`) } } class subject { constructor() { this.subs = []; } add(observer) { this.

JavaScript设计模式与开发实践---读书笔记(8) 发布-订阅模式

发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于异步编程中,这是一种替代传递回调函数的方案. 可以取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口. 自定义事件 首先要指定好谁充当发布者: 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者: 最后发布消息时,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数. 另外,我们还可以往回调函数里填入

javascript设计模式学习之八_发布订阅模式

一.发布订阅模式定义 发布订阅模式又叫做观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.发布—订阅模式可以取消对象之间硬编码的通知机制.javascript中的事件机制就属于发布订阅模式的一种. 二.发布订阅模式使用案例 2.1网站登录 假设正在开发一个网站,网站里面有header头部,nav导航,消息列表,购物车等模块,