当前位置: 首页 > 知识库问答 >
问题:

出版商订阅模式的现代替代方案

邢凌
2023-03-14

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

更新:我说过我会发布示例代码。首先,延斯推荐的Boost Signals 2真的很棒。我的代码与http://www . boost . org/doc/libs/1 _ 55 _ 0/doc/html/signals 2/tutorial . html上的初学者部分没有太大的不同

共有3个答案

段干楚青
2023-03-14

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

阳长恨
2023-03-14

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

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。

关正雅
2023-03-14

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

 类似资料:
  • 问题内容: 我想为re.sub提供替代的替换模式。 假设我有两种搜索模式可供选择,如下所示: 而不是提供一个替换模式,我想以某种方式捕获匹配哪个搜索模式的替换项并提供替换模式。这可能吗?谢谢。 PS。这里的代码细节无关紧要,这是一个普遍的问题。 问题答案: 您可以将函数传递给。在该函数中,您可以根据捕获的组返回所需的值。一个简单的代码说明: 该函数检查匹配是否成功,并根据捕获的组返回替换字符串。如

  • 问题内容: 我不太确定自己是如何陷入困境的,但是由于某种原因,我无法使用替代方法来更改Java的当前版本。我可以运行其他选项–config java并输入选择内容,但是当我回显java或javac的版本号时,它每次都会吐出1.5(尽管其他选项显示当前版本为1.6)。顺便说一下,我正在使用的服务器正在运行RHEL5。 我已验证替代方法中使用的路径指向正确的目录。这是我的会话的一些输出: [brile

  • Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2、client5 和 client1 之间的关系: 当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个

  • 我想用Java实现各种各样的发布者/订阅者模式,但目前已经没有主意了。 有1个发布者和N个订阅者,发布者发布对象,然后每个订阅者需要按照正确的顺序对每个对象进行一次且仅处理一次。发布者和每个订阅者在自己的线程中运行。 在我最初的实现中,每个订阅者都有自己的阻塞队列,发布者将对象放入每个订阅者的队列中。这可以正常工作,但如果任何订阅者的队列已满,发布者将被阻塞。这会导致性能下降,因为每个订阅者处理对

  • 我一直在通过Netbeans使用CodeNameOne设计一个应用程序,并遇到了一些问题,特别是“找不到符号”编译错误。经过进一步的研究,我发现这是由于CNO不支持某些库/杂项。 我想知道是否有其他方法可以使用以下库/执行任务: (从文件读取)导入java.io.file;符号:类文件位置:package java.io (抛出FileNotFoundException)导入java.io.Fil

  • 我有一个现有的工作项目与gulp工作流。一切都很顺利。我的gulp用了这个: null null 我是否可以在不使用的情况下对其进行包装,以避免出现该问题?