Ключом к шаблону публикации / подписки для обновлений является то, как обернуть информацию о том, что делать, когда срабатывает событие.
Когда объект, представляющий «Store X», обновляется новым именем и запускает событие, чтобы объявить об этом, какой объект потребляет событие?
Аналогично, когда добавляется Город Y, какой объект должен быть уведомлен о создании?
Один из распространенных подходов - иметь какой-то большой класс Uber-Manager, который обрабатывает весь процесс - он подписывается на все события и делает все.
Другой подход, который я использовал для хорошего эффекта, заключается в создании гораздо более простых объектов-оболочек / координаторов, которые обрабатывают только одну часть головоломки. Обычно я ставлю суффикс имени этих классов на «Editor
».
Итак, у вас может быть класс CityEditor
, конструктор которого принимает как объект City
, так и TreeNode
, представляющий этот объект. CityEditor
будет подписываться на события как для объекта City
, так и для TreeNode
, и будет заботиться о заполнении TreeNode
подписью и выборе значка.
Когда объект City обновляется, CityEditor
реагирует на вызванное событие обновлением TreeNode
. Когда объект City удален, CityEditor
обеспечивает удаление узла из Treeview
.
Когда новый объект Store добавляется в City
, CityEditor
может позаботиться о создании StoreEditor
для координации обновлений на этом уровне. Аналогичным образом, когда Employee
добавляется к Store
, экземпляр EmployeeEditor
обрабатывает обновления Treeview
.