4

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

  • 观察者模式
  • 信号/槽

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

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

对,所以我使用观察者模式,将“文本”作为主题,将“文本编辑器”作为观察者。没什么大不了的。

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

现在,如果我使用 TextEditor 来修改 Text 怎么办?

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

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

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

4

1 回答 1

4

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

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

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

  • 在调用 sendText 之前删除 TextEditor 作为观察者,然后再读取它
  • 如果所有调用都是同步的:通过设置属性来防止 TextEditor 自动刷新
  • ETC ...
于 2010-11-24T14:01:27.330 回答