发布者订阅模式的现代替代方案

Modern alternative to publisher subscriber pattern

本文关键字:方案 模式 发布者      更新时间:2023-10-16

我有一个c++ Windows应用程序。我正在处理发布者-订阅者的情况,其中一个类(发布者)定期生成数据并将其交给另一个类(订阅者),后者不断等待从发布者接收通知。我是设计模式的新手,我查找了发布者订阅者模型的常见实现,我注意到它们通常相当旧,并且通常涉及维护指向对象的指针列表。我想知道是否有更好的方法使用c++ 11来编码发布者订阅模型。或者使用完全不同的模型来代替发布者-订阅者。如果你能说出一些有趣的特性或方法,我将阅读它们的文档,编写一个实现并添加到这里以供进一步审查。

更新:我说过我会发布示例代码。首先,Jens推荐的Boost Signals 2确实非常有效。我的代码与关于http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html

的初学者部分没有太大的不同

看一下信号库,例如Boost。Signals2或libsigc++。它们提供了一种抽象,可以在类中定义客户机可以连接的信号。所有存储连接等的逻辑都在这里实现。

您可以存储函数向量,这里有一种快速而肮脏的方法:

template<class T>
class dispatcher
{
    std::vector<std::function<void(T)> > functions;
public:
    void subscribe(std::function<void(T)> f)
    {
        functions.push_back(f);
    }
    void publish(T x)
    {
        for(auto f:functions) f(x);
    }
};

这没有退订(你必须使用映射)。

然而,这不是线程安全的。如果你想要线程安全,你应该使用Boost.Signals2.

好吧,如果你想要现代的,真正现代的选择,也许,除了Boost。Signals2,正如Jens提到的,你可以尝试函数式响应式编程范式。