4

Я читал о том, как реализовать правильный MVC в C++ приложение и в основном пришел к тому, что есть 2 способа реализации этого:C++ «двунаправленный» шаблон наблюдатель

  • шаблон наблюдатель
  • сигнал/слот

Однако в обоих случаях exemples я прочитал все следуют структуру, в которой субъект может изменить и уведомить его наблюдатель (s), но наблюдатель никогда не меняет тему. Теперь в этих случаях возникает несколько «проблем».

Предположим, у меня есть класс под названием Text (компонент модели), другой класс называется TextEditor (компонент GUI), который каким-то образом отображает «Текст» и должен иметь возможность его модифицировать и несколько других классов, Текст ".

Правильно, поэтому я использую шаблон наблюдателя, создаю «Текст» темы и «Текстовый редактор» наблюдателя. Ничего страшного.

Если «Текст» каким-то образом изменен, текст вызывает Text :: notify(), и мой TextEditor отразит это изменение. Хорошо.

Теперь, если я использую TextEditor для изменения текста?

«TextEditor» знает о «тексте», поэтому он вызывает что-то вроде textInstance.setText (...) ... и в конце setText сообщения «Text» уведомляются, а «TextEditor» уведомляется о изменение сделало это! «Текст» не может даже отправлять уведомление всем, кроме «TextEditor», потому что не стоит знать о его наблюдателях!

У меня такое ощущение, что это неправильно, а не «чистые», даже соображения производительности. Держу пари, что есть лучший способ реализовать это, но я застрял. У кого-нибудь есть намеки?

Я не очень-то ищу работу с C++-реализацией, но в большей степени понимая, как я должен правильно ее видеть.

ответ

4

Узор чистый. Вы делаете предположение, чем TextEditor, теперь, что делает setText, и поэтому его не нужно уведомлять. Что делать, если текст был заморожен и отказывается модифицировать себя. Текст также может быть своего рода регистратором, который добавляет какой-либо новый текст и добавляет временную метку и т. Д.

Итак, для TextEditor совершенно необходимо «спросить» текст, чтобы что-то сделать, а затем проверить, какой результат. Так что TextEditor не уведомлен об изменении, которое оно произвело, но о том, как было изменено его изменение.

Если у вас действительно есть проблемы с производительностью, что вы можете сделать взломать шаблон наблюдателя по-разному

  • удалить TextEditor в качестве наблюдателя перед вызовом SendText и readding его потом
  • если все вызов синхронны: предотвращение TextEditor авто-обновления, установив атрибут
  • и т.д ...
+0

Очень ясно explananation, спасибо – Dinaiz 2010-11-24 15:02:44