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

时间:2014-07-31 19:06:33

标签: c++ design-patterns c++11 listener publish-subscribe

我有一个C ++ Windows应用程序。我正在处理发布者 - 订阅者的情况,其中我的一个类(发布者)定期生成数据并将其交给另一个类(订阅者),该类经常等待接收来自发布者的通知。我是设计模式的新手,我查找了发布者订阅者模型的常见实现,我注意到它们通常很老,而且它们通常涉及维护指向对象的指针列表。我想知道是否有更好的方法使用C ++ 11编写发布者订阅者模型。或者使用完全不同的模型代替发布者 - 订阅者。 如果您可以命名一些有趣的功能或方法,我会阅读它们的文档,编写实现并将其添加到此处以供进一步检查。

更新:我说我会发布示例代码。首先,Jens推荐的Boost Signals 2真的很棒。我的代码与http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html

上的初学者部分没有太大区别

3 个答案:

答案 0 :(得分:3)

查看信号库,例如Boost.Signals2libsigc++。它们提供了一个抽象来定义类中客户端可以连接的信号。所有存储连接的逻辑都在那里实现。

答案 1 :(得分:3)

你可以存储一个函数向量,这里有一个快速而又脏的方法:

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

答案 2 :(得分:1)

好吧,如果你想要现代的,非常现代的替代品,或许除了像Jens所提到的Boost.Signals2之外,你可以试试functional reactive programming范例。