如何将信号和插槽用于观察者模式?

时间:2013-02-14 11:05:47

标签: c++ design-patterns signals observer-pattern signals-slots

我编写了一个简单的观察者模式,其中观察者具有“void notify(std :: string)”函数,并且可观察对象在每个注册的观察者上调用它,并使用标记化的字符串来传输数据。这非常简单,容易且有效,但我需要前进一步。

我需要用信号和插槽来实现它(例如使用boost :: signals2)。但是我不知道插槽和信号应该是什么样子以及它们应该如何放置。我也不知道如何允许注册我想要的任何函数,而不仅仅是void(string)。

我找不到任何使用此模式的信号和插槽的好资源。然而每个人都说信号和插槽对于观察者模式来说是惊人的。你能指导我如何将信号和插槽用于观察者模式吗?

我目前没有信号的实施如下:

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;
}

我需要更改此模式以使用信号和插槽,但我不知道它应该如何有用,精心设计和灵活。

1 个答案:

答案 0 :(得分:6)

观察者模式如何运作?

  • Observer对象
  • “观察”可观察对象
  • 修改Observable时,会通知所有观察者已进行更改,例如调用“更新”或“通知”功能(或其他)

因此,就信号广告位而言。 基础是您将信号连接到插槽,每次发送它们所连接的信号时都会调用这些插槽。

你会发现在观察者模式中使用它非常容易:只需在Observable中创建一个信号,该信号将连接到用于更新它的每个观察者的插槽。

如果Observable发生变化。不是循环遍历所有观察者的列表,而是一个接一个地调用他们的update方法,而只是发出信号。神奇地会调用相应的插槽。

为了更进一步,你可以在Observable中有一个插槽,连接到Observer将发出的信号,告诉Observable在发生变化时必须注意它......

由于我从未使用Boost::signals2,因此无法为您提供完整的示例代码,但是您应该查看How do I use boost::signals to implement the observer pattern?Observer design pattern in C++以便让您前进:)