【问题标题】:c++ "bi-directional" observer patternc++“双向”观察者模式
【发布时间】:2011-05-15 02:31:04
【问题描述】:

我一直在阅读有关如何在 C++ 应用程序中实现正确的 MVC 的文章,并且基本上得出了以下观点:有两种实现方式:

  • 观察者模式
  • 信号/槽

但是,在这两种情况下,我阅读的示例都遵循主题可以更改并通知其观察者的结构,但观察者永远不会改变主题。现在这种情况出现了一些“问题”。

假设我有一个名为 Text 的类(一个模型组件),另一个名为 TextEditor 的类(一个 GUI 组件),它以某种方式显示“文本”并且应该能够修改它以及其他一些可以修改“文本”的类' 也一样。

是的,所以我使用观察者模式,将“Text”作为主题,将“TextEditor”作为观察者。没什么大不了的。

如果“文本”以某种方式更改,文本调用 Text::notify(),我的 TextEditor 将反映更改。美好的。

现在,如果我使用 TextEditor 来修改 Text 会怎样?

'TextEditor' 知道'Text',所以它调用类似 textInstance.setText(...) ...并且在 setText 结束时,'Text' 调用通知,并且'TextEditor' 被通知它自己所做的更改! 'Text' 甚至不能向除 'TextEditor' 之外的所有人发送通知,因为它不应该知道它的观察者!

我觉得这是不对的,即使抛开性能原因也不“干净”。 我敢打赌有更好的方法来实现这一点,但我被卡住了。有人有提示吗?

我并不是真的在寻找预制的 C++ 实现,而是更多地了解我应该如何正确看待事物。

【问题讨论】:

    标签: model-view-controller user-interface bidirectional observer-pattern


    【解决方案1】:

    图案很干净。您现在比 TextEditor 假设 setText 正在做什么,因此不需要通知。如果文本已被冻结并拒绝修改自己怎么办。文本也可以是一种记录器,可以附加任何新文本并添加时间戳等。

    因此,TextEditor “要求” Text 做某事然后检查结果是完全干净的。 因此,TextEditor 不会被通知它自己所做的更改,而是通知它所请求的更改是如何被管理的。

    如果你真的有性能问题,你可以用不同的方式破解观察者模式

    • 在调用 sendText 之前将 TextEditor 作为观察者移除,然后再读取它
    • 如果所有调用都是同步的:通过设置属性防止 TextEditor 自动刷新
    • 等等...

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 2012-02-15
      • 2013-12-30
      • 2012-08-19
      • 2013-10-28
      相关资源
      最近更新 更多