观察者模式还是回调?

Gab*_*mas 13 oop design-patterns

我必须做的一个设计DownloadManager,但我的主要问题是关系到一个通知Download可以发送到DownloadManageronUpdate()更新进度条,onError(),onFinish(),等不知不觉中,这些DownloadManager具有从其收到此通知Download秒.

我想过两种可能的方法:

  • 观察者模式
  • 回调

观察者模式

基本上有1个Observable和N Observers.在我的情况下,DownloadManager有一个Observer和下载Observables,因此关系是N Observables 1 Observer,恰恰相反.

优点是将所有可能的通知集中在一个方法中,来自Observers 的notify()or update()(from java)方法,在我的例子中只有DownloadManager.我可以使用通知代码将参数传递给notify()方法.

坏处?我正在使用oop模式来完成一个可以通过回调轻松完成的事情.此外,N观察者1观察者它是奇怪的,至少对于观察者模式,因为这个模式是为1个可观察的N个观察者完成的,所以我真的不会使用观察者模式.

打回来

与观察者模式非常相似.DownloadManager实现了一个"监听器"(接口).此侦听器实现onFinish(),onUpdate()等通知函数.然后,此侦听器必须在所有下载中注册,因此当下载完成时,它将调用listener.onFinish().另外,我可以从下载中将参数传递给此方法,就像在观察者模式中一样.

优点:易于使用.缺点:没有.

我可能会使用回调,因为在我看来,对一个观察者N观察者使用观察者模式是没有意义的.

而你,哪个选项会用?

Cal*_*ngh 3

回调 FTW。它更简单,并且在绝大多数情况下,简单性会以积极的方式影响项目的每个其他方面,包括开发、调试、优化、文档记录和进一步维护。

  • 5年后……“正确的方式”似乎是观察者模式。看看大多数 JavaScript API:它们正在用 Promise 替换回调。看看 Angular 2:他们用 Observables 取代了回调和 Promises。所以回调很容易,但从长远来看不是一个好的选择。 (6认同)