2009-03-29 8 views
1

Ich habe einen Agenten, der auf bestimmte Bedingungen überwacht. Für jede Bedingung möchte ich einen anderen Beobachter benachrichtigen, weil die Verantwortung für diese Bedingung beim Beobachter liegt.Was ist der beste Weg, um Beobachtermuster für viele Typen zu implementieren?

Die Methode für einen einzelnen Beobachter/Subjekt in C++, laut Wikipedia, ist eine virtuelle Klasse (ähnlich einer Java-Schnittstelle), die die Update-Methode für den Observer definiert und die Registermethode definiert für das Thema. Jede konkrete Klasse erbt dann ihre jeweilige Schnittstelle.

Ich kann jedoch vorstellen, dass dies für eine beliebige Anzahl von Bedingungen auftritt, von denen jede eine andere Schnittstelle und eine konkrete Beobachterklasse für jede neue Bedingung benötigt. Macht eine Art Design Sinn? Und klingt es vernünftig, für jede neue Bedingung eine Beobachterschnittstelle hinzuzufügen?

Antwort

3

Wenn Sie vergleichen diese auf einer GUI-Komponente mit Ereignissen Java Angebote Hacke (nicht genau das gleiche, aber die gleiche allgemeine Idee), wickeln Sie mit etwas nach oben wie:

public void addActionListener(ActionListener listener) { } 
public void addWindowListener(WindowListener listener) { } 
public void addComponentListener(ComponentListener listener) {} 
public void addMouseListener(MouseListner listener) {} 

alle der * Listener Dinge sind Schnittstellen. Sie stellen dann eine oder mehrere Klassen bereit, die die Schnittstellen implementieren (ich bevorzuge eine Klasse pro Listenertyp, andere ziehen es vor, eine einzelne Klasse zu erstellen, die alle Listener implementiert).

Dies erweist sich als sehr flexibel sein, weil die Dinge nur für die Veranstaltungen anmelden können, die sie interessieren.

Eine Alternative eine einzige „addListener (Listener Hörer)“ Methode ist, wo die Listener-Schnittstelle jedes einzelnes mögliche Ereignis hat In diesem Fall wäre das eine schlechte Idee, es sei denn, du bist in Ordnung, wenn Dinge über Ereignisse gemeldet werden, die ihnen egal sind.

Also, erwarten Sie feinkörnige Kontrolle darüber, was Sie hören können? Wenn ja, funktioniert das Java-Modell gut (funktioniert auch, wenn es Ihnen egal ist, es ist sehr flexibel). Wenn du denkst, dass alles über alle Ereignisse informiert werden will, dann funktioniert auch der einzelne "Master" Weg.

Es klingt, als ob Sie eine feinkörnige Steuerung wünschen, also würde es mir gut gehen, es zu tun, die Java-Ereignisweise einer Schnittstelle für jede allgemeine Kategorie von Ereignissen.

+0

Ah, richtig, es ist sehr ähnlich zu dem Windows-Event-Modell, um darüber nachzudenken. –

Verwandte Themen