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

use*_*947 3 c++ design-patterns signals signals-slots 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Scy*_*dor 7

Observer模式如何工作?

  • Observer对象"观察"可观察对象
  • 当Observable被修改时,它会通知所有观察者已经做出改变,例如通过调用他们的"更新"或"通知"功能(或其他)

所以,就信号插槽而言.基础是你将信号连接到插槽,每次发射它们所连接的信号时都会调用这些插槽.

您会发现在Observer模式中使用非常简单:只需在Observable中创建一个信号,该信号将连接到用于更新它的每个Observer的插槽.

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

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

因为我从未使用过Boost::signals2,所以无法为您提供完整的示例代码,但您应该看一下如何使用boost :: signals来实现观察者模式?C++中的Observer设计模式让你去:)