如何使用观察员模式的信号和插槽
How to use signals and slots for observer pattern?
我写了一个简单的观察者模式,其中观察者有"void notify(std::string)"函数,可观察对象在每个注册的观察者上调用它,并使用标记化的字符串来传输数据。这是非常简单,容易和有效的,但我需要向前迈进一步。
我需要用信号和插槽来实现它(例如使用boost::signals2)。然而,我不知道插槽和信号应该是什么样子,以及它们应该如何放置。我也不知道如何允许注册我想要的任何函数,而不仅仅是void(字符串)。
我找不到任何使用信号和插槽的好资源。然而,每个人都说,对于观察者模式来说,信号和槽是惊人的。你能告诉我观察者模式应该如何使用信号和插槽吗?
我目前没有信号的实现如下:
class observable
{
public:
void register(observer *);
void unregister(observer *);
protected:
void notifyObservers()
{
for every registered observer
observer.notify(std::string tokenized_string);
}
}
class observer
{
public:
void notify(std::string) = 0;
}
我需要改变这种模式来使用信号和插槽,但我不知道它应该如何有用、设计良好和灵活。
Observer模式是如何工作的?
- 观察者对象"观察"可观察对象
- 当一个Observable被修改时,它会通知所有的观察者已经做出了更改,例如通过调用他们的"更新"或"通知"函数(或其他什么)
因此,就信号和插槽而言。基本原理是将信号连接到插槽,每次发出连接到插槽的信号时都会调用插槽。
你会发现在Observer模式中使用它非常容易:只需在Observable中创建一个信号,该信号将连接到用于更新它的每个Observer的插槽
以防Observable发生变化。不必循环遍历所有观察者的列表,也不必一个接一个地调用他们的update
方法,只需发出信号即可。相应的插槽将被神奇地调用。
更进一步,例如,你可以在Observable中有一个插槽,连接到一个Observable将发出的信号,告诉Observable在发生变化时必须注意它。。。
由于我从未使用过Boost::signals2
,因此无法为您提供一个完整的工作示例代码,但您应该看看我如何使用boost::信号来实现观测器模式?和C++中的Observer设计模式:)
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- Qt moveToThread,带有参数的信号/插槽
- moc 文件中缺少信号插槽
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 信号/插槽多线程 Qt
- 通过排队的QT信号插槽连接发送QSHAREDPOINTERS的QVECTOR
- Qimage没有通过信号插槽QT
- 使用 Qt5 的新信号/插槽实现向滑块发出信号
- 一个类中的QT信号/插槽,但从不同的线程发出
- 信号/插槽基类多继承
- 在QT C 中使用QMOVIE和信号/插槽之间在GIF中导航
- 在 for 循环中使用 lambda 函数连接信号插槽
- 不同类别的 2 个对象之间的信号/插槽
- 如何正确使用qt的信号/插槽系统
- Qt信号插槽视觉工作室:似乎未连接
- QACTION信号插槽中的无形UI
- Qt-连接触发动作中的信号/插槽
- Qt 信号插槽类范围类型
- 信号/插槽 Qt5 C++