android - 内容观察者是观察者模式的实现吗?

标签 android design-patterns android-contentprovider android-contentresolver android-mvp

观察者模式由“四人帮”定义Design Patterns book作为“对象之间的一对多依赖关系,以便当一个对象更改状态时,它的所有依赖项都会得到通知并自动更新”。 enter image description here

他们还说观察者模式应该在以下任何情况下使用:

  • 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.

关于亚当·斯特劳德 Android Database Best Practices book它指出“Cursor 类提供了向数据源公开观察者模式的方法。并且,通过使用这些方法,可以使用观察者模式响应数据更改,而不是轮询数据库以获取更改,这可能效率低下”:

  • Cursor.registerContentObserver()

  • Cursor.unregisterContentObserver()

  • Cursor.setNotificationUri()

类似地,通过使用 ContentProvider,我们可以使用 ContentResolver 客户端对象来访问 Content Provider 中的数据,然后注册一个 ContentObserver 来监听观察者注册的 URI 背后的数据变化。

因此,作为观察者模式中的主题对象,ContentResolver 的方法在我看来几乎是相同的:

enter image description here

  • 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)本身是否是观察者模式的实现?

即使我发现一些证据表明它可能是观察者模式的实现,我也想要一个具体的答案来解释它是否真的是观察者模式的实现。

最佳答案

是的,这些组件提供了观察者模式的实现。

《四人帮》一书中描述的设计模式中最重要的部分是它们所体现的概念。方法、类的命名等细节通常因实现而异。 Attach()/Detach()register()/unregister()watch()/unwatch()等。这样的选择最终影响相对较小。关键问题是:实现是否与您引用的描述相匹配,即它是否是“对象之间的一对多依赖关系,以便当一个对象更改状态时,它的所有依赖项都会得到通知并自动更新”。我认为我们这里显然有这种情况。此外,拥有一个名为 ContentObserver 的类也很好地表明我们确实正在处理观察者模式的一个版本。

当然,这里还有一层额外的复杂性,因为 Android API 的要求通过将其分为 ContentProviderContentProvider 来使 Subject 的结构变得复杂。 ContentResolver 类。在这种情况下,ContentProvider 实际上是 Subject,但所有交互都需要通过 ContentResolver 进行处理。然而,这种复杂性并没有改变行为的基本性质;它仍然是观察者模式。

关于android - 内容观察者是观察者模式的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374785/

相关文章:

android - CoordinatorLayout 将布局放在彼此之上

安卓 ViewAnimator : animation while changing viewstub child

android - 布局不填充父级

c# - Compact Framework - 是否有可用的 MVC 框架/库?

java - 防止其他类实例化类

java - 根据日期从MySQL数据库中获取数据

android - 多个 ContentProvider 可以提供相同的 URI 吗?

android - 用于重定向 href 链接的 android webview backkey 中的死循环

c# - 解决这个问题的最佳设计模式是什么?

android - ContentProvider、Loader 和 ProgressBar