Является ли Content Observer реализацией шаблона Observer?

Шаблон наблюдателя определяется книгой шаблонов проектирования "Бригада четырех" как " зависимость один-ко-многим между объектами, поэтому, когда один объект меняет состояние, все его зависимые элементы уведомляются и обновляются автоматически ".

Они также говорят, что шаблон Observer следует использовать в любой из следующих ситуаций:

  • Когда абстракция имеет два аспекта, один зависит от другого. Инкапсуляция этих аспектов в отдельных объектах позволяет варьировать и повторно использовать их независимо.

  • Когда изменение одного объекта требует изменения других, и вы не знаете, сколько объектов нужно изменить.

  • Когда объект должен иметь возможность уведомлять другие объекты, не делая предположений о том, кто эти объекты. Другими словами, вы не хотите, чтобы эти объекты были тесно связаны.

В книге Adam Stroud Android Database Best Practices говорится, что "класс Cursor предоставляет методы, которые предоставляют шаблон Observer источнику данных. И с помощью этих методов можно реагировать на изменения данных, используя шаблон Observer, а не опрос базы данных на предмет изменений, которые могут быть неэффективными ":

  • Cursor.registerContentObserver ()

  • Cursor.unregisterContentObserver()

  • Cursor.setNotificationUri ()

Аналогичным образом, используя ContentProvider, мы можем использовать клиентский объект ContentResolver для доступа к данным из провайдера контента, а затем зарегистрировать ContentObserver для прослушивания изменений данных за URI, для которого зарегистрирован наблюдатель.

Итак, как объект Subject в шаблоне Observer, ContentResolver имеет методы, которые, по моему мнению, почти одинаковы:

  • registerContentObserver () ContentResolver - это Attach() из темы

  • unregisterContentObserver() для ContentResolver - это Dettach() от субъекта

  • notifyChange() для ContentResolver - это Notify() от субъекта

Итак, мой вопрос заключается в том, являются ли три компонента ContentProvider (ContentProvider, ContentResolver и ContentObserver) сами по себе реализацией шаблона Observer?

Даже если бы я нашел доказательства того, что это может быть реализация шаблона Observer, я хотел бы получить конкретный ответ, объясняющий, действительно ли это реализация шаблона Observer или нет.

1 ответ

Решение

Да, эти компоненты обеспечивают реализацию шаблона наблюдателя.

Наиболее важной частью шаблонов проектирования, описанных в книге "Банды четырех", являются концепции, которые они воплощают. Такие детали, как присвоение имен методам, классам и т. Д., Часто варьируются от реализации к реализации. Attach()/Detach(), register()/unregister(), watch()/unwatch()и т. д. Такой выбор в конечном итоге имеет сравнительно небольшое значение. Ключевой вопрос: соответствует ли реализация описанию, которое вы цитировали, то есть является ли она "зависимостью" один ко многим "между объектами, так что когда один объект изменяет состояние, все его зависимые элементы уведомляются и обновляются автоматически". Я полагаю, что у нас явно такая ситуация здесь. Кроме того, имея класс с именем ContentObserver Это также хороший признак того, что мы действительно имеем дело с версией паттерна наблюдателя.

Конечно, здесь есть дополнительный уровень сложности в том, что требования API Android усложнили структуру Subject разделив его на ContentProvider а также ContentResolver классы. В этом случае ContentProvider действительно Subject, но все взаимодействия должны быть обработаны через ContentResolver, Тем не менее, это осложнение не меняет фундаментальную природу поведения; это все еще Образец Наблюдателя.