【问题标题】:How to use signals and slots for observer pattern?如何将信号和槽用于观察者模式?
【发布时间】:2013-02-14 11:05:47
【问题描述】:

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

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

【问题讨论】:

  • @Denis Ermolin 我不知道我应该如何为这种模式使用信号和插槽(当前没有信号的实现是不够的)。这就是为什么我需要一些指导,它应该如何处理信号和插槽。
  • 你读过Boost.Signals吗?
  • @Johnsyweb 是的。我只需要一点指导,因为我不完全了解如何以这种模式实现信号以从中受益。

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


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多