观察者模式由“四人帮”定义。 Design Patterns book作为" 对象之间的一对多依赖关系,这样当一个对象更改状态时,其所有依赖关系都会自动得到通知和更新"。
他们还说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的方法根据我的想法几乎相同:
ContentResolver的registerContentObserver()是来自Subject
的Attach()
ContentResolver的unregisterContentObserver()是来自主题的Dettach()
ContentResolver的notifyChange()是来自主题的Notify()
所以,我的问题是,如果ContentProvider的三个组件(ContentProvider,ContentResolver和ContentObserver)本身就是Observer模式的实现吗?
即使我发现一些证据表明它可能是Observer模式的实现,我想要一个具体的答案来解释它是否真的是Observer模式的实现。
答案 0 :(得分:2)
是的,这些组件提供了观察者模式的实现。
" Gang of Four"描述的设计模式中最重要的部分。书是他们所体现的概念。诸如方法,类等的命名之类的细节通常因实现而异。 Attach()/Detach()
,register()/unregister()
,watch()/unwatch()
等。这些选择最终的影响相对较小。关键问题是:实现是否与您引用的描述相匹配,即它是对象之间的一对多依赖关系,这样当一个对象改变状态时,其所有依赖关系都会自动得到通知和更新。 。我建议我们在这里明显有这种情况。另外,拥有一个名为ContentObserver
的类也是一个很好的迹象,表明我们确实在处理一个Observer模式的版本。
当然,这里有一个额外的复杂层,因为Android API的要求通过将Subject
和ContentProvider
类分开来使ContentResolver
的结构复杂化。在这种情况下,ContentProvider
实际上是Subject
,但所有互动都需要通过ContentResolver
进行处理。然而,这种并发症并没有改变行为的基本性质;它仍然是观察者模式。