Отображение объектов для их наблюдателей - шаблон GoF для наблюдателей - PullRequest
0 голосов
/ 07 сентября 2018

В книге шаблонов проектирования GoF, когда речь идет о части реализации шаблона Observer, указано:

Отображение объектов на их наблюдателей Самый простой способ для субъекта отслеживать наблюдателей, которых он должен notify должен хранить ссылки на них явно в теме. Однако такое хранение может быть слишком дорогим когда есть много предметов и мало наблюдателей. Одно из решений - обменять пространство на время, используя ассоциативный поиск (например, хеш-таблица) для поддержания отображения субъекта-наблюдателя. Таким образом, субъект без Наблюдатели не несут накладных расходов на хранение. С другой стороны, такой подход увеличивает стоимость доступа наблюдатели.

Я не вижу, как использование хеш-таблицы увеличит емкость хранилища. В Java для каждого предмета у нас может быть список наблюдателей List<Observer>. Если к этой теме нет наблюдателей, ссылка на список будет нулевой. Если мы используем хеш-таблицу, Map<Subject, List<Observer>, у нас все еще есть список, но у нас также есть ссылка на тему, так что этот путь немного больше памяти неэффективен. Я не знаю, насколько это актуально, но языки, используемые для реализации в книге Gof, - Smalltalk и C ++.

1 Ответ

0 голосов
/ 07 сентября 2018

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

С другой стороны, если отображения субъекта-наблюдателя централизованы в один Map, только (несколько) наблюдаемых объектов имеют какой-либо след памяти. Правильно указать, что стоимость памяти для наблюдаемого субъекта выше при централизованном отображении из-за необходимости хранить ссылки на субъекты, поэтому такой дизайн имеет смысл только тогда, «когда имеется много субъектов и мало наблюдателей» .

Обратите внимание на более современный пример оптимизации кода, чтобы избежать пустых коллекций: Зачем перегружать метод varargs () в интерфейсе Java Stream?

...