如何使用观察员模式的信号和插槽

How to use signals and slots for observer pattern?

本文关键字:信号 插槽 模式 何使用 观察员      更新时间:2023-10-16

我写了一个简单的观察者模式,其中观察者有"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设计模式:)