2011-01-03 7 views
12

私はどういうわけかDownloadManagerがこれを受信しなければならないなど、DownloadManagerの設計をしなければならないが、私のメインの質問はDownloadは、プログレスバーを更新するためにonUpdate()ようDownloadManagerに送信できる通知に関連して、onError()onFinish()通知はDownloadです。オブザーバーパターンまたはコールバック?

  • Observerパターン
  • コールバック

Observerパターン

基本的には1人の観察可能とNオブザーバーがあります

私は2つの可能な方法を考えました。私の場合、DownloadManagerにはObserverがあり、Observablesはダウンロードされているので、N Observables 1 Observerの関係になります。

利点は、Observersのnotify()またはupdate()(javaから)メソッドの場合、すべての可能な通知を、私の場合はDownloadManagerのみに集中させることです。通知のコードを使用して、notify()メソッドにパラメータを渡すことができます。

短所?私はコールバックで簡単に行うことができるもののためのoopパターンを使用しています。また、N個のオブザーバブルオブザーバー1人は観測者パターンで少なくとも何か変わっています。なぜなら、このパターンは観測可能なN個のオブザーバー1人のために行われたからです。したがって、私は実際にオブザーバーパターンを使用しません。オブザーバーパターンに非常に類似し

コールバック

。 DownloadManagerは "リスナー"(インターフェイス)を実装しています。このリスナーは、onFinish()、onUpdate()などの通知関数を実装します。このリスナーはすべてのダウンロードに登録する必要があります。ダウンロードが完了すると、listener.onFinish()が呼び出されます。さらに、オブザーバのパターンのように、ダウンロードからこのメソッドにパラメータを渡すことができます。

利点:簡単に使用します。 短所:なし。

私はおそらくコールバックを使用します。なぜなら、私の意見では、1人のオブザーバーのNオブザーバブルに対してオブザーバーパターンを使用することは意味がないからです。

あなたはどのオプションを使用しますか?

+1

"コールバックアドバンテージ:簡単に使用。短所:なし"私はあなたの答えを見つけたと思います。 –

+0

コールバックを使用することの1つの欠点は、プログラムの結合を増加させることです(一般に、新しいパラメータを使用するすべての関数に新しいパラメータが追加されるため)。 – synack

+0

私はあなたがここで説明したコールバックは、さまざまなステータス変更の更新の便宜のために、複数の(オーバーロードされたような)アップデート(Observable o、Object arg)メソッドを持つObserverデザインパターンを再度説明したと思います。 –

答えて

3

コールバックFTW。それは簡単であり、大多数の場合、シンプルさは、開発、デバッグ、最適化、文書化、および更なるメンテナンスを含む、積極的な方法でプロジェクトの他のすべての側面に影響します。

+2

5年後...「正しい方法」はオブザーバーパターンのようです。ほとんどのJavaScript APIを見てください:彼らはPromisesのコールバックを置き換えています。 Angular 2を見てください:彼らはObservablesのCallbacksとPromisesを置き換えました。 コールバックは簡単ですが、長期的には良い選択ではありません。 – CedX

3

オブザーバは、より柔軟でスケーラブルです。あなたがオブザーバーのパターンについて言及したすべての使い方の後で、それは奇妙ではありません。あなたのニーズに合うように少し変更する必要がある場合、Pattersはまったくガイドラインの後にあります。

DownloadManagersが複数ある場合を考えてみてください(特定の状況で有効なユースケースではない可能性があります)。両方を登録する必要があります。さらに多くのことがある場合は、それらのすべてを登録する必要があります。かなり長いリストに加えて、リスナー管理を実装する必要があります。Download

+0

実際、私のDownloadManagerはシングルトンです。私は自分のアプリケーションにインスタンスが1つしかありません。 –

4

Observer/Callbackアプローチの反対のオプションもあります。 DownloadManagerのクライアントは、パッシブプレイヤーからアクティブプレイヤーになることができます。マネージャからのメッセージを待つ代わりに、彼らは定期的にステータスを要求します。

このようにして、ダウンロードプロセスはエンドユーザーにとってよりスムーズになります。そして、あなたはそれをより良くコントロールすることができます。

もちろん、2つのスレッドを使用する必要があります。または、DownloadManagerを小さなステップで動作させるように教えなければならず、解読不可能な作業を実行するのではなく、クライアントに制御を戻す必要があります。

3

オブザーバは、マネージャが多くのインスタンスに要求を送信する必要があるため、より適切です。

実装が簡単です。実装ポイントでは、プログレスバーの機能性と、それぞれどれだけダウンロードされたか、および合計ダウンロード率の点でスケーラビリティが向上します。

関連する問題