Content Observer 是观察者模式的实现吗?
Is Content Observer an implementation of Observer Pattern?
观察者模式由 'Gang of Four' Design Patterns book 定义为“对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新”。
他们还说观察者模式应该在以下任何一种情况下使用:
When an abstraction has two aspects, one dependent on the
other. Encapsulating these aspects in separate objects lets you vary and reuse them independently.
When a change to one object requires changing others, and you don't know how many objects need to be changed.
When an object should be able to notify other objects without making
assumptions about who these objects are. In other words, you don't
want these objects tightly coupled.
关于 Adam Stroud Android Database Best Practices book 它指出 "the Cursor class provides the methods that expose the Observer pattern to a source of data. And, by using these methods, it is possible to respond to data changes using the Observer Pattern rather than polling the database for changes, which can be inefficient":
Cursor.registerContentObserver()
Cursor.unregisterContentObserver()
Cursor.setNotificationUri()
同样,通过使用ContentProvider,我们可以使用ContentResolver 客户端对象从Content Provider 访问数据,然后注册一个ContentObserver 来监听观察者注册的URI 后面的数据变化。
所以,ContentResolver作为Observer模式中的Subject对象,其方法在我看来几乎是一样的:
registerContentObserver() of ContentResolver is Attach() from Subject
unregisterContentObserver() of ContentResolver is Dettach() from Subject
notifyChange() of ContentResolver is Notify() from Subject
所以,我的问题是,如果 ContentProvider 的三个组件(ContentProvider、ContentResolver 和 ContentObserver)本身就是观察者模式的实现?
即使我找到了一些证据表明它可能是观察者模式的实现,我也想要一个具体的答案来解释它是否真的是观察者模式的实现。
是的,这些组件提供了观察者模式的实现。
"Gang of Four" 书中描述的设计模式最重要的部分是它们所体现的概念。方法的命名、classes 等细节通常因实现而异。 Attach()/Detach()
、register()/unregister()
、watch()/unwatch()
等。这样的选择最终无关紧要。关键问题是:实现是否与您引用的描述相匹配,即它是 "one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically" 吗?我建议我们这里显然有这种情况。此外,有一个名为 ContentObserver
的 class 也很好地表明我们确实在处理观察者模式的一个版本。
当然,这里还有一层复杂性,因为 Android API 的要求将 Subject
的结构分成了 ContentProvider
和 ContentResolver
class 是的。在这种情况下,ContentProvider
实际上是 Subject
,但所有交互都需要通过 ContentResolver
处理。然而,这种复杂化并没有改变行为的基本性质;它仍然是观察者模式。
观察者模式由 'Gang of Four' Design Patterns book 定义为“对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新”。
他们还说观察者模式应该在以下任何一种情况下使用:
When an abstraction has two aspects, one dependent on the other. Encapsulating these aspects in separate objects lets you vary and reuse them independently.
When a change to one object requires changing others, and you don't know how many objects need to be changed.
When an object should be able to notify other objects without making assumptions about who these objects are. In other words, you don't want these objects tightly coupled.
关于 Adam Stroud Android Database Best Practices book 它指出 "the Cursor class provides the methods that expose the Observer pattern to a source of data. And, by using these methods, it is possible to respond to data changes using the Observer Pattern rather than polling the database for changes, which can be inefficient":
Cursor.registerContentObserver()
Cursor.unregisterContentObserver()
Cursor.setNotificationUri()
同样,通过使用ContentProvider,我们可以使用ContentResolver 客户端对象从Content Provider 访问数据,然后注册一个ContentObserver 来监听观察者注册的URI 后面的数据变化。
所以,ContentResolver作为Observer模式中的Subject对象,其方法在我看来几乎是一样的:
registerContentObserver() of ContentResolver is Attach() from Subject
unregisterContentObserver() of ContentResolver is Dettach() from Subject
notifyChange() of ContentResolver is Notify() from Subject
所以,我的问题是,如果 ContentProvider 的三个组件(ContentProvider、ContentResolver 和 ContentObserver)本身就是观察者模式的实现?
即使我找到了一些证据表明它可能是观察者模式的实现,我也想要一个具体的答案来解释它是否真的是观察者模式的实现。
是的,这些组件提供了观察者模式的实现。
"Gang of Four" 书中描述的设计模式最重要的部分是它们所体现的概念。方法的命名、classes 等细节通常因实现而异。 Attach()/Detach()
、register()/unregister()
、watch()/unwatch()
等。这样的选择最终无关紧要。关键问题是:实现是否与您引用的描述相匹配,即它是 "one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically" 吗?我建议我们这里显然有这种情况。此外,有一个名为 ContentObserver
的 class 也很好地表明我们确实在处理观察者模式的一个版本。
当然,这里还有一层复杂性,因为 Android API 的要求将 Subject
的结构分成了 ContentProvider
和 ContentResolver
class 是的。在这种情况下,ContentProvider
实际上是 Subject
,但所有交互都需要通过 ContentResolver
处理。然而,这种复杂化并没有改变行为的基本性质;它仍然是观察者模式。