Лучший шаблон для уведомления об изменениях (события или делегаты) - PullRequest
2 голосов
/ 19 ноября 2010

У меня есть решение, в котором я передаю коллекцию предметов от источника докладчику.Когда источник обновляется, я хочу иметь возможность уведомить докладчика, чтобы показать новый результат.

Что приходит на ум, это создать класс ChangeNotification, передать его вместе с результатом и попросить этот класс уведомить докладчика.,Теперь, как я понимаю, это может быть реализовано двумя способами: либо ChangeNotification может иметь события, на которые подписчик подписан, либо он может иметь делегатов, которые устанавливает докладчик, и исходные вызовы, если оно не равно нулю.Преимущества использования событий заключаются в том, что больше, чем потребитель может реагировать на уведомление, и вы можете подключить к нему реактивные расширения, недостатком является то, что вам нужно управлять подпиской / отменой подписки на события для правильной сборки мусора.Делегаты просты, но вы теряете некоторую гибкость.

Какой самый элегантный шаблон для подобной ситуации?Есть ли какой-то другой способ, о котором я не подумал?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Если у вас будет несколько наблюдателей, потребуются события или множественные делегаты. Если у вас будет только один наблюдатель, и вы захотите применить его, достаточно делегата. Тем не менее, с точки зрения того, что лучше, IMHO, я бы сказал, что это событие более гибкое и очень хорошо поддается шаблону. ObservableCollection и INotifyPropertyChanged являются реализациями, основанными на событиях. Кстати, +1 к тбищелю за ссылки на эти классы.

2 голосов
/ 19 ноября 2010

Существует два встроенных шаблона для этого сценария.

Во-первых, вы можете реализовать интерфейс INotifyPropertyChanged .Это лучше, если вы хотите уведомить докладчика об изменениях свойств самих объектов в коллекции.(или сам исходный объект, если именно там происходят изменения).

Второй - передать вашему докладчику ObservableCollection , содержащую ваши объекты.Это лучше, если вы хотите уведомить докладчика, что элемент был добавлен или удален из коллекции.Обе модели являются управляемыми событиями, к которым может подключиться любой подписчик.


Редактировать: Базовым шаблоном является шаблон "Наблюдатель" ... вы можете развернуть свою собственную версию, если выхочу, у вас есть детали вниз.

0 голосов
/ 19 мая 2011

Я согласен с другими ответами о том, что INotifyPropertyChanged, INotifyCollectionChanged и другие связанные интерфейсы являются свойством первого поворота, но я хотел добавить третий вариант, который заключался бы в реализации шаблона наблюдателя. Если вы не знакомы с этим шаблоном, это то, как Java достигает своей функциональности события через так называемые прослушиватели событий . Нет причины, по которой этот шаблон не может быть принят в C #, хотя в некоторых случаях он может обеспечить более элегантное решение, чем использование событий и делегирование, особенно когда может быть несколько скоординированных событий, на которые, как правило, все подписаны заинтересованные стороны.

Другая опция также является производной от DependencyObject и реализует DependencyProperties для получения уведомлений об изменениях, которые являются встроенными и оптимизированы для WPF. Я склонен не идти по этому пути, потому что мне не нравится требование иметь определенный базовый класс, но есть некоторые веские аргументы в пользу того, почему он иногда является правильным выбором, и на самом деле некоторые инфраструктуры MVVM даже используют его в качестве основы для уведомлений об изменениях для классов ViewModel тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...