内容观察者是Observer Pattern的实现吗?

时间:2018-03-20 00:58:52

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

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

他们还说Observer模式应该在以下任何一种情况下使用:

  •   

    当抽象有两个方面时,一个依赖于   其他。将这些方面封装在单独的对象中可以让您独立地改变和重用它们。

  •   

    当对一个对象的更改需要更改其他对象时,您不知道需要更改多少个对象。

  •   

    当一个对象应该能够在不进行通知的情况下通知其他对象   关于这些对象是谁的假设。换句话说,你不是   希望这些物体紧密耦合。

在Adam Stroud Android Database Best Practices book上,它指出" Cursor类提供了将Observer模式暴露给数据源的方法。并且,通过使用这些方法,可以使用观察者模式响应数据更改,而不是轮询数据库中的更改,这可能是低效的"

  •   

    Cursor.registerContentObserver()

  •   

    Cursor.unregisterContentObserver()

  •   

    Cursor.setNotificationUri()

类似地,通过使用ContentProvider,我们可以使用ContentResolver客户端对象从Content Provider访问数据,然后注册ContentObserver以监听观察者注册的URI后面的数据更改。

因此,作为Observer模式中的Subject对象,ContentResolver的方法根据我的想法几乎相同:

enter image description here

  •   

    ContentResolver的registerContentObserver()是来自Subject

    的Attach()
  •   

    ContentResolver的unregisterContentObserver()是来自主题的Dettach()

  •   

    ContentResolver的notifyChange()是来自主题的Notify()

所以,我的问题是,如果ContentProvider的三个组件(ContentProvider,ContentResolver和ContentObserver)本身就是Observer模式的实现吗?

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

1 个答案:

答案 0 :(得分:2)

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

" Gang of Four"描述的设计模式中最重要的部分。书是他们所体现的概念。诸如方法,类等的命名之类的细节通常因实现而异。 Attach()/Detach()register()/unregister()watch()/unwatch()等。这些选择最终的影响相对较小。关键问题是:实现是否与您引用的描述相匹配,即它是对象之间的一对多依赖关系,这样当一个对象改变状态时,其所有依赖关系都会自动得到通知和更新。 。我建议我们在这里明显有这种情况。另外,拥有一个名为ContentObserver的类也是一个很好的迹象,表明我们确实在处理一个Observer模式的版本。

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