【问题标题】:Observer pattern with one observer and many subjects一个观察者和多个主题的观察者模式
【发布时间】:2010-07-27 07:55:07
【问题描述】:

我想实现观察者模式,我想让 X 类观察 A 类和 B 类的更新。

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

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

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

谢谢,

托马斯

【问题讨论】:

  • 为什么不使用 boost.signals?这是一个已解决的问题
  • 我不能在我目前工作的环境中使用 boost。不是我的选择。

标签: c++ oop observer-pattern


【解决方案1】:

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

【讨论】:

  • 好点,我猜你想让我在更新函数中发送一个'this'指针和枚举?或者 Observable 基类是否解决了 X 如何以另一种方式分离 A 和 B?
  • 通常observable基类还提供通知功能,以及跟踪谁在看。 (有关概述,请参阅codeguru.com/cpp/tic/tic0290.shtml),但是是的,如果通知的管理是由不同的类完成的,您可以在 update 方法中传递一个指针来指示已更改的对象。
  • 这样做的缺点是你需要在update()中向下转换来确定observable的具体类。这使得实现变得脆弱且难以维护。
  • 是的。但是,如果 A 和 B 像 OP 所暗示的那样不同,那么观察者希望对它们做的任何事情似乎都不太可能在没有某种方式的情况下实现。当然,除非 A 和 B 可以从封装了观察者希望调用的任何功能的第二个类继承。
  • 我相信模板提供了更好的解决方案。
【解决方案2】:

我看到以下选项:

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

【讨论】:

    猜你喜欢
    • 2019-08-22
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多