Является ли 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
, Тем не менее, это осложнение не меняет фундаментальную природу поведения; это все еще Образец Наблюдателя.