|
Заблокирован
|
|
Чем паттерн Наблюдатель лучше механизма событий?19.10.2023, 11:31. Показов 2247. Ответов 34
Метки нет (Все метки)
На первый взгляд, паттерн Наблюдатель легко заменяется, даже код проще будет и понятнее, с помощью событий. Если это не так, то почему не так?
0
|
|
| 19.10.2023, 11:31 | |
|
Ответы с готовыми решениями:
34
Паттерн наблюдатель
Создать паттерн Наблюдатель |
|
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
|
||||||||
| 19.10.2023, 22:40 | ||||||||
Сообщение было отмечено titan4ik как решение
РешениеЕсли нужен просто мгновенный сигнал на большое число подписчиков, то велосипедим свое, пример сравнения:
Многие вещи нужно прочувствовать через практику, чтобы понять как это работает. Если вам напишут в статье "ExecutionContext is everywhere where code is executed." - Вы поймете? Как создать кастомный ExecutionContext? У вас не было никогда ощущения, что вы является коробочным (out-of-box) непрограммистом? Вот есть WCF, настроил binding-и и вуаля - можно пользоваться. Но кто-то же это написал. Тут еще можно провести аналогию паттернов как со стандартами/протоколами и их реализациями. Блин, слишком много тут вам придется расписывать, чтобы дать исчерпывающий ответ. Мне лень это делать в 3-ем часу ночи... Слишком много может быть нюансов, поэтому нужно все пропускать через себя.
1
|
||||||||
|
Заблокирован
|
||||
| 19.10.2023, 23:03 [ТС] | ||||
![]() Спасибо! Добавлено через 5 минут
0
|
||||
|
Заблокирован
|
|||
| 19.10.2023, 23:09 [ТС] | |||
|
Добавлено через 1 минуту ВСЁ!)
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 20.10.2023, 09:00 | ||
Сообщение было отмечено titan4ik как решение
РешениеЕсли вам нужен какой-то дополнительный функционал, как например тот, который предоставляется интерфейсом IObserver, то реализуйте с нуля на здоровье. Так же стоит учитывать, что события были в языке с версии 1.0, т.е. этой реализации уже без малого 25 лет. За годы язык оброс дополнительным функционалом и подходы к реализации несколько поменялись — в некоторых случаях функционал событий может быть не достаточным для вашего сценария. Например, подписчики в событиях выполняются последовательно. Если вам нужна параллельная обработка, то события не подходят. Так же события/мультикаст-делегаты практически не работают с асинхронными методами. Или у вас какой-то расширенный функционал, требующий дополнительного взаимодействия с подписчиками, который отсутствует в делегатах (см. тот же IObserver). В общем, смотрите по ситуации. Если события решают вашу задачу — пользуйтесь на здоровье.
1
|
||
|
608 / 390 / 198
Регистрация: 31.03.2013
Сообщений: 2,700
|
|
| 20.10.2023, 09:12 | |
|
1
|
|
|
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
|
|
| 20.10.2023, 09:23 | |
|
Midian, да не суть, поведение не изменится.
Цель того примера - показать, что 3 синхронных подписчика займут 1.5 секунды времени (каждый проспав по 0.5), а асинхронные подписчики тоже будут выполняться последовательно, но они не будут выполнять код, а просто стартовать Task-и на потоках из пула. Это может быть важно, когда например, объект - Observable - выполняющий какой-то hot-throughput path код (например, в сетевых приложениях), должен очень быстро выполнять уведомление своих подписчиков и быстро продолжать свою работу. То есть это яркий пример, когда может понадобиться offloading (тот что дает нам responsiveness в GUI приложениях). Хотя для сигналов у Task-ов еcть более надежные механизмы - TaskCompletionSource-ы, или всякие ванильные *ResetEvent-ы. Но это уже другая история.
1
|
|
|
|
|||||||
| 20.10.2023, 09:46 | |||||||
|
Технически event -- так называемый "сахар", который призван упростить написание однотипного кода. Грубо говоря нам очень часто нужно для объекта по изменению его состояния сделать какие-либо действия. Самая простая реализация выглядит так:
Теперь насчет IObserver и прочего. Во-первых, такой подход явно логически выделяет объект, что он именно наблюдатель/подписчик/источник. event в объекте воспринимается скорее как ещё одно свойство или около того, т.е. объект явно сложный (хотя нам ничто не мешает объявит интерфейс с единственным ивентом). Во-вторых, если у нас есть алгоритм написанный пращурами на каком-нибудь кобольде, и нам нужно просто перенести один-в-один -- скорее всего там 100500 наблюдателей, а значит не помешает прям из коробки иметь что-то в этом духе. Третье:
1
|
|||||||
|
Заблокирован
|
||||||
| 20.10.2023, 12:19 [ТС] | ||||||
|
Что касается возможности параллельного выполнения делегатов - мне это отличие явной реализации паттерна Наблюдатель от событий сразу в глаза бросилось. Но я решил, что асинхронные методы, подписанные на событие, запускаемые последовательно и выполняемые асинхронно (могут и параллельно выполняться - это уже решит мудрая автоматическая оптимизация) решают проблему. В каком случае это не так? Добавлено через 9 минут Добавлено через 6 минут
0
|
||||||
|
608 / 390 / 198
Регистрация: 31.03.2013
Сообщений: 2,700
|
|||||||||||||
| 20.10.2023, 12:26 | |||||||||||||
в любом случае, событие выполняется в главном потоке в очереди Dispatcher и при подписке в определенном порядке он будет вызвано тоже в этом же порядке
1
|
|||||||||||||
|
Заблокирован
|
|
| 20.10.2023, 12:32 [ТС] | |
|
В общем, по сути вопроса ответ получен. Его можно так резюмировать:
Если механизм событий удовлетворяет, то паттерн Наблюдатель нет смысла явно реализовывать. А если по каким-то критериям механизм событий не решает задачи или решает не лучшим образом, то тогда можно решать её через явную реализацию паттерна, используя все его возможности (это надо ещё понять что там за особые возможности - простые примеры реализации их не раскрывают) и дополнительно включая туда всё необходимое. Понятно. Это понятно. Спасибо! Попутно в обсуждении было много интересного (и не вполне понятного - спасибо, есть что иметь ввиду для дальнейшего понимания!).
0
|
|
|
|
|||||||
| 20.10.2023, 12:38 | |||||||
Теперь насчет асинхроных методов. По сути это Func<Task> для примера выше, и в коде вместо Console.WriteLine(result); нужно выполнить await для всех подписантов (ну или около того). Но как писал выше -- мы можем получить только последний результат (который ещё и не гарантирован средой CLR, т.е. на одной версии очередность будет одна, на другой -- иная).
2
|
|||||||
|
Заблокирован
|
||
| 20.10.2023, 12:48 [ТС] | ||
|
Добавлено через 2 минуты Wolfdp, спасибо за разъяснения!
0
|
||
|
Заблокирован
|
|
| 28.02.2024, 18:22 [ТС] | |
|
Добавлю статейку по теме: https://www.codeproject.com/Ar... -in-Csharp
0
|
|
| 28.02.2024, 18:22 | |
|
Паттерн Наблюдатель - записать содержимое TextBox в файл Паттерн Наблюдатель паттерн наблюдатель (observer) паттерн Наблюдатель и логгирование Паттерн наблюдатель vs События Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|