4

私はC++アプリケーションで適切なMVCを実装する方法について読み、基本的にこれを実現するための2つの方法があることをポイントに来てきた:C++「双方向」オブザーバーパターン

  • オブザーバーパターン
  • は、
  • 信号/スロット

しかしながら、両方の場合において、私はすべての読み取りexemplesは、被験体は、それが観察者(S)の変革と通知することが可能な構造に従うが、観察者が被写体を変えることはありません。今、このケースはいくつかの "問題"を引き起こします。

Text(モデルコンポーネント)というクラスがあり、TextEditor(GUIコンポーネント)という名前のクラスがあります。これは、 'Text' ANDを変更することができるはずです。テキストも同様です。

右のように、私はオブザーバーパターンを使用しますので、 'テキスト'をサブジェクトに、 'テキストエディター'をオブザーバーにします。大きな問題ではない。

'Text'が何らかの形で変更された場合、TextはText :: notify()を呼び出し、TextEditorはその変更を反映します。ファイン。

TextEditorを使用してテキストを変更するとどうなりますか?

'TextEditor'は 'Text'を知っているので、textInstance.setText(...) ...のようなものを呼び出し、setTextの最後に 'Text'コール通知と 'TextEditor'それはそれ自身を変えた! 「TextEditor」以外のすべての人に通知を送ることさえできません。なぜなら、それはオブザーバーについて知っているとは思わないからです!

私はこれが正しいわけではなく、パフォーマンス上の理由でさえ「クリーン」ではないと感じています。 これを実装するより良い方法があると思いますが、私は立ち往生しています。誰もがヒントを持っていますか?

私はあらかじめ作られたC++の実装を本当に見ているわけではありませんが、どのように正しく表示されるべきかの理解を深めることができます。

答えて

4

パターンがきれいです。 TextEditorよりもsetTextがやっていることを前提にしているので、通知する必要はありません。テキストがフリーズして、それ自体を変更することを拒否した場合はどうなりますか?テキストは、新しいテキストを追加してタイムスタンプなどを追加する種類のロガーでもあります。

したがって、TextEditorが何かをして結果を確認するためにTextを尋ねるのはきれいです。 TextEditorはそれ自体が変更を通知されるのではなく、要求された変更がどのように管理されたかを通知されます。

あなたは本当にすべての呼び出しが同期している場合は、別の方法でオブザーバーパターン

  • をハック何ができるか、パフォーマンスの問題がsendTextを呼び出し、
  • 後でそれをreadding前にオブザーバーとしてテキストエディタを削除している場合:防止属性など
  • ...
+0

非常に明確explananationを設定することにより、オートリフレッシュのテキストエディタ、ありがとうございました – Dinaiz