Мы все знаем observer pattern: У вас есть тема, которая может уведомлять и обновлять список наблюдателей об изменениях состояния. Теперь предположим, что объект, который вы хотели бы наблюдать, представляет собой контейнер, и вы хотели бы наблюдать сам контейнер, то есть добавление и удаление элементов, а также содержащиеся элементы, то есть обновление состояния элементов контейнера.Как вы эффективно реализуете шаблон наблюдателя, если объект является огромным контейнером?
Как реализовать механизм обновления так, чтобы он был быстрым в отношении вставки и удаления элементов при хранении огромного количества объектов в вашем контейнере? В частности,
- Вы бы использовали один и тот же контейнер в локальной копии наблюдателей?
- есть ли разумный выбор контейнера, который должны использовать наблюдатели? (Например, было бы быстрее, скажем, всегда использовать сбалансированные деревья, даже если вы наблюдаете связанный список?)
- Как вы быстро переводите итератор в наблюдаемый контейнер в итератор в контейнер наблюдателя? (Тривиально для массивов, трудно для связанных списков?)
Если ваш контейнер является связанным списком, например, вы можете вставлять элементы в постоянное время. Если m наблюдателям приходится перебирать список, содержащий n элементов, то обновление принимает O (n * m) ожидаемое время.
Если ваш контейнер является массивом, то изменение элемента занимает постоянное время, а обновление m наблюдателей принимает O (m), если вы передаете индекс элемента O (n * m), если наблюдатели должны проходить через массив.
Если это помогает, рассмотрим следующие примеры:
Пример 1. Вы пишете операционную систему. Тема, которую вы хотели бы наблюдать, - это файловая система и ее файлы. Ваши представления - это проводник файлов, индекс и другие приложения. Вы хотели бы обновить наблюдателей, когда файлы будут добавлены, удалены или изменены.
Пример 2. Вы пишете приложение адресной книги, которое должно иметь возможность обрабатывать город размером с Нью-Йорк. Тема, которую вы хотели бы наблюдать, - это контейнер ваших записей (человек с его адресом, номерами телефонов, электронной почтой ...). Ваши наблюдатели представляют собой несколько видов, которые должны обновляться автоматически при добавлении, удалении или изменении записи. (Можно было бы отобразить один вид, содержащий список людей, которые живут на 53-й и другие точки рисования на карте для каждого человека, чья фамилия - Doe).
Как вы обрабатываете случай, когда полное поддерево директорий удалено или что «53rd St» переименовано в «Dijkstra St»?
Меня интересует, как сделать механизм обновления эффективным, когда объект является контейнером. – Tobias
@GrGr: Тобиас исправил текст. –
Уверен, что это зависит. Вот почему я хотел бы знать, что сделали другие, и если есть общие правила, как подойти к этой проблеме. Фактически, я был бы рад получить ссылки на конкретные примеры, где эти проблемы решаются эффективно. – Tobias