4

我一直在閱讀有關如何在C實施適當的MVC++應用程序,基本上來到了這一點,有2種方式實現這一點:C++「雙向」觀察者模式

  • 觀察者模式
  • 信號/插槽

然而,在這兩種情況下,我讀了所有的exemples跟隨,在向被攝體可以改變並通知它的觀察者(S)的結構,但觀察者永遠不變的主題。現在這種情況出現了一些「問題」。

比方說,我有一個名爲Text(一個模型組件)的類,另一個名爲TextEditor(一個GUI組件),它通常顯示'文本',並且應該能夠修改它和其他幾個可以修改'文字「。

對,所以我使用觀察者模式,使'文本'的主題和'文本編輯器'的觀察員。沒什麼大不了。

如果以某種方式更改「文本」,則文本將調用Text :: notify(),並且我的TextEditor將反映更改。精細。

現在,如果我使用TextEditor來修改文本,該怎麼辦?

'TextEditor'知道'Text',所以它調用類似於textInstance.setText(...) ...並且在setText結尾處,'Text'調用notify,'TextEditor'被通知改變了它自己! '文本'甚至不能發送通知給除'TextEditor'之外的所有人,因爲它不是想知道它是觀察者!

我有這樣的感覺,這是不對的,不是「乾淨」,甚至表現的理由。 我敢打賭有一個更好的方法來實現這個,但我卡住了。任何人都有提示?

我不是真的期待預先製作的C++實現,但更多的是理解我應該如何正確看待事情。

回答

4

圖案很乾淨。你現在比TextEditor做出的假設是什麼setText正在做什麼,所以不需要通知。如果文本被凍結並拒絕修改自己,該怎麼辦?文本也可以是一種附加任何新文本並添加時間戳的記錄器等。

因此,它是完全乾淨的TextEditor「問」文本做些什麼,然後檢查結果是什麼。 因此,TextEditor不會收到它自己做出的更改通知,而是要求對其進行的更改進行管理。

如果你真的有性能問題,你可以做些什麼叫sendText和readding它後來

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

    • 刪除文本編輯作爲觀察員:預防通過設置屬性自動刷新的TextEditor
    • etc ...
  • +0

    非常明確的解釋,謝謝 – Dinaiz 2010-11-24 15:02:44