Я просто смотрел в рамки Poco. У меня есть еще один базовый фреймворк, который уже использовал фреймворк Poco и абстрагирует некоторые его части, чтобы сделать его еще проще.
Я хочу объяснить проблему простым сценарием:
Учтите, что в моей программе есть объект в форме прямоугольника. Форма имеет частный hit Testing
методы внутри него и при тестировании на попадание в течение определенного времени, я должен был вызвать функцию в другом классе, т.е. Fountain
учебный класс.
Мне не нужно передавать какую-либо конкретную информацию об объекте формы в функцию в Fountation
учебный класс. Моя структура уже дает мне некоторые функциональные возможности NotifyEvent
а также AddListener
, Если бы я использовал этот подход, в моем классе формы было бы событие, которое было бы подписано в фонтане Add Listener
(объект, если передана форма) и событие уведомление из класса формы.
Теперь, с помощью центра уведомлений Poco, вместо передачи ссылки на объект shape в базовый класс, я передам NotificationCenter
ссылка на второй класс. fountain
класс будет иметь наблюдателя, и наблюдатель будет уведомлен от postNotification()
Единственное различие, которое я вижу здесь между двумя подходами, заключается не в передаче информации об определенном объекте.
Я просто более свежий разработчик, пытающийся по возможности выучить хорошие практики кодирования, и не совсем понимаю, как здесь развязаться. Как эти два класса разделены здесь? (потому что я не прохожу shape
объект и просто используя notificationcenter
объект?)
РЕДАКТИРОВАТЬ: Добавление к вышеупомянутому вопросу. Допустим, у меня есть 10 других классов, которые должны прослушивать определенное уведомление, поэтому мне придется передать ссылку на Notification Center
ко всем этим классам, а? Только так я смогу добавить наблюдателя для центра уведомлений в мои классы.
В основном да. Если Fountain
класс знает только о NotificationCenter
то это не связано с формой (Rectangle
или другие) больше. Это предполагает, что уведомление, отправленное формами, также не зависит от объекта, который его запускает.
Редактировать: ответ на ваши изменения — да, вам нужно позвонить addObserver
метод с каждым объектом, который нуждается в уведомлениях
Что вам нужно сделать, так это разделить процесс отправки и получения сообщений на структуру Observer — Listener. Это называется Шаблон наблюдателя. Вы можете прочитать более подробную информацию об этом шаблоне Вот. Это избавит вас от необходимости иметь дело с несколькими ссылками и событиями, а также от размышлений о реализации отправки / получения сообщений каждый раз, когда вам нужно добавить сообщение в другой класс.
Вы можете найти больше информации о шаблонах дизайна в книге Шаблоны проектирования. Элементы многоразового объектно-ориентированного программного обеспечения.