C++“双向”观察者模式

C++“双向”观察者模式

问题描述:

我一直在阅读有关如何在C实施适当的MVC++应用程序,基本上来到了这一点,有2种方式实现这一点:C++“双向”观察者模式

  • 观察者模式
  • 信号/插槽

然而,在这两种情况下,我读了所有的exemples跟随,在向被摄体可以改变并通知它的观察者(S)的结构,但观察者永远不变的主题。现在这种情况出现了一些“问题”。

比方说,我有一个名为Text(一个模型组件)的类,另一个名为TextEditor(一个GUI组件),它通常显示'文本',并且应该能够修改它和其他几个可以修改'文字“。

对,所以我使用观察者模式,使'文本'的主题和'文本编辑器'的观察员。没什么大不了。

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

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

'TextEditor'知道'Text',所以它调用类似于textInstance.setText(...) ...并且在setText结尾处,'Text'调用notify,'TextEditor'被通知改变了它自己! '文本'甚至不能发送通知给除'TextEditor'之外的所有人,因为它不是想知道它是观察者!

我有这样的感觉,这是不对的,不是“干净”,甚至表现的理由。 我敢打赌有一个更好的方法来实现这个,但我卡住了。任何人都有提示?

我不是真的期待预先制作的C++实现,但更多的是理解我应该如何正确看待事情。

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

因此,它是完全干净的TextEditor“问”文本做些什么,然后检查结果是什么。 因此,TextEditor不会收到它自己做出的更改通知,而是要求对其进行的更改进行管理。

如果你真的有性能问题,你可以做些什么叫sendText和readding它后来

  • 如果所有的调用都是同步之前破解观察者模式以不同的方式

    • 删除文本编辑作为观察员:预防通过设置属性自动刷新的TextEditor
    • etc ...
  • +0

    非常明确的解释,谢谢 – Dinaiz 2010-11-24 15:02:44