具有一个观察者和多个主题的观察者模式

发布于 2024-09-11 05:14:16 字数 310 浏览 3 评论 0原文

我想实现观察者模式,并且希望类 X 观察类 A 和 B 中的更新。X

派生自抽象基类 XObs,它具有 update() 函数,以枚举作为所发生事件的参数。

这里的逻辑问题是 X 需要知道 A 和 B 中的哪一个发送了更新,而 X 无法从枚举参数中确定这一点。

在 update() 中添加另一个参数来告诉 A 和 B 中哪一个发送了更新,有什么优点/缺点?还有哪些其他方法可以解决这个问题? (我不想为 A 和 B 创建基类并在 update() 中发送 this 指针,因为 A 和 B 完全不同。)

谢谢,

Tomas

I want to implement the observer pattern and I want class X to observe updates in classes A and B.

X is derived from the abstract base class XObs which has the update() function taking an enum as parameter of what has happened.

The logical problem here is that X needs to know which of A and B sent the update and X cannot determine that from the enum parameter.

What are the pros/cons of adding another parameter to update() which tells which of A and B sent the update? What other ways are possible to solve this? (I rather not create a base class for A and B and send a this pointer in the update() as A and B are quite different.)

Thanks,

Tomas

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最笨的告白 2024-09-18 05:14:16

a 和 b 的公共基类不必具有任何不同的功能 - 它只需要用来表达 A 和 B 是 Observable 的事实。从这个意义上说,A 和 B 并不是“完全不同”,而是相同的。

The common base class for a and b doesnt have to have any distinct functionality - it just needs to be used to express the fact that A and B are Observable. In this sense A and B are not 'quite different', they are the same.

书信已泛黄 2024-09-18 05:14:16

我看到以下选项:

  • 让 A 和 B 实现一个通用的 Observable 基类(并将它们作为参数传递给 update() - 问题是,你需要在 update() 中向下转型 来检测参数是 A 还是 B,这使得解决方案变得脆弱,
  • update() 中添加某种类型标志参数 - 这与上一个非常相似,只是少了一些面向对象
  • 模板化 Observer / Observable 实现 - 我还没有在脑海中完全解决这个问题(并且我没有 C++ IDE 来验证它),但我相信这样你可以有两个 update 重载() 具有不同的(A 和 B)类型参数,因此处理是分开且简单的,所以这将是我的首选选项

I see the following options:

  • make both A and B implement a common Observable base class (and pass them as parameters to update() - the problem is, you need to downcast in update() to detect whether the parameter is of A or B, which makes the solution fragile
  • add some sort of type flag parameter to update() - this is fairly similar to the previous one, only less object oriented
  • templatize the Observer / Observable implementation - I haven't worked this out fully in my head (and I don't have a C++ IDE to verify it), but I believe this way you can have two overloads of update() with different (A and B) type parameters, thus the handling is separated and straightforward, so this would be my preferred option
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文