3

我写了一个简单的观察者模式,其中观察者具有“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;
}

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

4

1 回答 1

7

观察者模式是如何工作的?

  • 可观察对象被观察者对象“监视”
  • 当一个 Observable 被修改时,它会通知所有观察者发生了变化,例如通过调用他们的“更新”或“通知”函数(或其他)

因此,就信号插槽而言。基本原理是将信号连接到插槽,每次发出它们连接的信号时都会调用它们。

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

在 Observable 发生变化的情况下。而不是遍历所有观察者的列表,并update一个接一个地调用他们的方法,只需发出信号。相应的插槽将被神奇地调用。

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

Can't get you a fully working example code since I never used Boost::signals2, but you should take a look at How do I use boost::signals to implement the observer pattern? and Observer design pattern in C++ to get you going :)

于 2013-02-14T13:06:40.483 回答