发布者订阅模式的现代替代方案
Modern alternative to publisher subscriber pattern
我有一个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提到的,你可以尝试函数式响应式编程范式。
相关文章:
- 运行同一解决方案的另一个项目的项目
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- Project Euler问题4的错误解决方案
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 此模式的C++RegEx
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- C++ 单例设计模式替代方案
- 我在这里滥用继承权吗?什么是最佳实践替代方案/模式?
- 用于以下方案的模式
- 发布者订阅模式的现代替代方案
- 寻找字符串模式的更好解决方案
- 使用本机C++、托管 C++ CLI 和 C# 解决方案在混合模式下进行调试
- 用于全局模式匹配的递归解决方案
- 等待条件的非线程替代方案.(编辑:Proactor模式与boost.asio?)
- 无法在调试模式下编译解决方案,因为缺少MSVCR100D.dll