2011-01-03 17 views
12

Ich habe einen Entwurf eines DownloadManager zu tun, aber meine Hauptfrage ist mit den Datenübermittlungen, die ein Download zum DownloadManager wie onUpdate() senden kann ein Fortschrittsbalken zu aktualisieren, onError(), onFinish() etc. Irgendwie ist der DownloadManager diese erhalten hat Benachrichtigungen von seiner Download s.Beobachtermuster oder Callback?

Ich habe 2 Möglichkeiten gedacht:

  • Observer Muster
  • Rückrufe

Observer Muster

Grundsätzlich gibt es 1 beobachtbar und N Beobachter. In meinem Fall muss der DownloadManager ein Observer sein und der Download der Observables, also ist die Beziehung N Observables 1 Observer, genau das Gegenteil.

Der Vorteil ist, alle möglichen Benachrichtigungen in einer Methode zu zentralisieren, die notify() oder update() (von Java) -Methode von den Beobachtern, in meinem Fall nur der DownloadManager. Ich kann einen Parameter an die notify() -Methode mit dem Code der Benachrichtigung übergeben.

Nachteil? Ich benutze ein Oop-Muster für eine Sache, die einfach mit einem Callback erledigt werden kann. Außerdem beobachtet N einen Beobachter, es ist etwas seltsam, zumindest mit dem Beobachtermuster, weil dieses Muster für 1 beobachtbare N Beobachter gemacht wurde, so dass ich das Beobachtermuster wirklich nicht verwenden werde.

Rückruf

Sehr ähnlich dem Beobachter-Muster. Der DownloadManager implementiert einen "Listener" (Schnittstelle). Dieser Listener implementiert die Benachrichtigungsfunktionen onFinish(), onUpdate() usw. Dann muss dieser Listener in allen Downloads registriert sein. Wenn ein Download beendet ist, wird er listener.onFinish() aufrufen. Zusätzlich kann ich aus den Downloads Parameter an diese Methoden übergeben, wie im Beobachtermuster.

Vorteil: Einfache Verwendung. Nachteil: Keine.

Ich werde wahrscheinlich einen Callback verwenden, weil es meiner Meinung nach keinen Sinn macht, ein Beobachtermuster für 1 Beobachter N Observablen zu verwenden.

Und Sie, welche Option wird verwendet?

+1

"Rückruf. Vorteil: Einfache Verwendung. Nachteil: Keine." Ich denke du hast deine Antwort gefunden. –

+0

Ein Nachteil der Verwendung von Callbacks besteht darin, dass sie die Kopplung des Programms erhöhen (da sie in der Regel allen Funktionen, die sie verwenden, einen neuen Parameter hinzufügen). – synack

+0

Ich denke, Callback, was Sie hier erklärt haben, wieder ein Observer Design Pattern mit mehreren (so etwas wie überladen) update (Observable o, Object arg) -Methoden für die Bequemlichkeit der verschiedenen Statuswechsel-Updates. –

Antwort

3

Rückrufe FTW. Es ist einfacher, und in der überwiegenden Mehrzahl der Fälle beeinflusst Einfachheit alle anderen Aspekte des Projekts positiv, einschließlich der Entwicklung, Fehlerbehebung, Optimierung, Dokumentation und weiteren Wartung.

+2

5 Jahre später ... Der "richtige Weg" scheint das Observer-Muster zu sein. Sehen Sie sich die meisten JavaScript-APIs an: Sie ersetzen die Rückrufe durch Versprechen. Schau dir Angular 2 an: sie haben die Callbacks und Promises durch Observables ersetzt. So Callbacks sind einfach, aber nicht eine gute Wahl auf lange Sicht. – CedX

3

Der Beobachter ist flexibler/skalierbar. Ist das nach all dem, was du für das Beobachtermuster erwähnt hast, nicht komisch? Patters sind schließlich nur Richtlinien, wenn Sie es ein bisschen ändern müssen, um Ihre Bedürfnisse zu erfüllen, dann gehen Sie dafür.

Betrachten Sie den Fall, wenn Sie mehrere DownloadManagers haben (vielleicht ist dies kein gültiger Anwendungsfall für Ihre spezielle Situation). Sie müssen beide registrieren. Wenn Sie noch mehr haben, müssen Sie alle registrieren.Ziemlich lange Liste, plus müssen Sie Listeners Management in der Download s

+0

Tatsächlich ist mein DownloadManager ein Singleton. Ich habe nur eine Instanz in meiner Anwendung. –

4

zu implementieren Es gibt auch eine Option, die gegenüber Observer/Callback-Ansatz ist. Sie können Kunden von DownloadManager von passiven zu aktiven Spielern der Show machen. Anstatt auf eine Nachricht vom Manager zu warten, werden sie regelmäßig ihren Status anfordern.

So wird Ihr Download-Prozess für den Endbenutzer viel reibungsloser aussehen. Und Sie werden es besser kontrollieren können.

Natürlich müssen Sie zwei Threads verwenden. Oder Sie müssen dem DownloadManager beibringen, in kleinen Schritten zu arbeiten, die Kontrolle an seinen Klienten zurückzugeben, anstatt eine unzerbrechliche Arbeit zu laufen.

3

Observer ist besser geeignet, da Manager Anforderungen an viele Instanzen senden müssen.

Es ist einfach zu implementieren. In Umsetzung Punkt wird es mehr skalierbar in Bezug auf Fortschrittsbalken Funktionalität und wie viel heruntergeladen werden jeweils und insgesamt Download

Verwandte Themen