39 Stimmen

Rückruf/Befehl vs. EreignisListener/Beobachter-Muster

Ich versuche, einen asynchronen Rahmen zu entwerfen und wollte wissen, was die Leute denken, sind die Vor- und Nachteile der Callback-Muster vs die Beobachter-Muster.

Callback pattern:

//example callback
public interface Callback{
    public void notify(MethodResult result);
}

//example method
public class Worker{
  public void doAsyncWork(Callback callback){
     //do work
     callback.notify(result);
  }
}

//example observer pattern
public interface EventListener{
   public void notify(MethodResult result);

}

public class Worker{
  private EventListener listener;
  public registerEventListener(EventListener listener){
   this.listener=listener;
  }
  public void doAsyncWork(){
     //do work
     listener.notify(result);
  }
}

Ich arbeite mit einem Framework, das beide Muster zu verwenden scheint. Das EventListener-Muster ist nicht das typische Muster, da es keine Liste von Listenern hat. Dies kann jedoch leicht implementiert werden, indem man einen CompositeListener erstellt, der seine eigene Semantik bezüglich der Priorität der Listener hat und wie die Verteilung von Ereignissen an jeden Listener gehandhabt werden soll, z.B. durch das Erzeugen eines neuen Threads für jeden Listener im Vergleich zu seriellen Benachrichtigungen. (Ich denke eigentlich, dass dies eine gute Idee ist, da es eine gute Trennung der Anliegen und ist eine Verbesserung auf die Standard-Beobachter/Listener-Muster).

Haben Sie eine Idee, wann Sie die beiden verwenden sollten?

Vielen Dank.

0voto

Alan Evangelista Punkte 2496
  • Rückruf: Ausführbarer Code, der als Argument an eine Funktion übergeben wird, die bei Eintreten eines bestimmten Ereignisses aufgerufen wird. Er kann in verschiedenen Programmiersprachen in unterschiedlicher Form implementiert werden, z. B. als Funktionszeiger, anonyme Funktionen und Listener/Beobachter (objektorientiertes Paradigma). Sie oft auf einen einzigen ausführbaren Code verweist, aber das ist nicht erforderlich. Ein Gegenbeispiel: Die SurfaceHolder-Schnittstelle in Android SDK (API-Ebene 29) ermöglicht die Registrierung mehrerer Rückrufe mit der Methode addCallback().
  • Listener/Beobachter: Im objektorientierten Paradigma ist es ein Objekt mit einer Methode, die als Argument an eine Funktion übergeben wird, die aufgerufen wird, wenn ein bestimmtes Ereignis eintritt. Es handelt sich um eine mögliche Implementierung von mehreren Rückrufen.
  • Observer-Muster: ein objektorientiertes Software-Entwurfsmuster, das die Verwendung von Beobachtern/Listenern empfiehlt, um die Beobachterklasse von der beobachteten Klasse zu entkoppeln.

In Ihrem speziellen Code sind die einzigen Unterschiede zwischen Callback und EventListener:

  • Sie erlauben die Registrierung nur eines Rückrufs, aber die Registrierung mehrerer EventListener
  • Die Callback-Registrierung ist mit der Ausführung der asynchronen Aufgabe synchronisiert, die EventListener-Registrierung ist es nicht.

Ersteres ist einfacher, letzteres ist flexibler. Wenn Sie einen wiederverwendbaren Rahmen erstellen, ist Letzteres sinnvoller.

Das Befehlsentwurfsmuster ist die Kapselung aller Informationen, die zur Durchführung einer Aktion in einem Objekt benötigt werden, und hat nichts mit dem Mechanismus zu tun, mit dem Ereignisse gemeldet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X