2010-07-28 9 views
7

Hey alle, ich arbeite derzeit an einer Java Swing-Anwendung und ich suchte nach einer Anleitung. Die Anwendung ist ziemlich klein, aber ich merke, dass, während die Code-Basis größer wird, ich eine Menge Kopplung in meinem Objekt-Graphen habe. Ich bin relativ neu in Swing, aber ich habe lange genug programmiert, um zu wissen, wohin das führt.Entwurfsmuster, um die Kopplung in Swing-Anwendung zu reduzieren

Das größte Problem, das ich habe, ist meine Ereignisbehandlung einzurichten. Wie sollen meine Kind-Fenster und Objekte Ereignisse an meine Objekte auf höherer Ebene kommunizieren, ohne auf sie Bezug zu nehmen? Ich habe eine ganze Menge MVC-Web-Coding gemacht. Ist dieses Muster gut für Swing geeignet? Soll ich meinen eigenen Controller bauen? Ich glaube, ich fange nur nach Mustern, die Leute als nützlich empfunden haben, mit Swing zu arbeiten.

Vielen Dank im Voraus für Ihre Hilfe.

+0

Siehe auch http://stackoverflow.com/questions/3072979 – trashgod

Antwort

5

Der beste Weg, um die Kopplung in einer GUI zu reduzieren, denke ich ist, einen Event Bus zu verwenden. Es gibt mehrere bestehende Implementierungen, darunter einige, die Swing spezifisch unterstützen.

Nur google for swing event bus und Sie werden finden. Wenn Sie Guice in Ihrer GUI verwenden, können Sie auch einen Blick auf guts-events werfen.

+0

Danke, das ist das, was ich suchte eine API einen Messaging-Bus über die Anwendung zur Verfügung zu stellen. Ich habe Muts-Event und http://www.eventbus.org/ angeschaut. Ich denke, ich werde mit dem späteren gehen. – BillMan

+0

Das ist in Ordnung, ich habe EventBus in der Vergangenheit benutzt und musste mich nicht beschweren Ich erinnere mich jedoch in einigen Versionen, dass die Verwendung von Annotationen für Event-Consumer Speicher verlieren könnte, ich weiß nicht, ob dies in der neuesten Version behoben wurde. – jfpoilpret

0

Wie Sie bereits gesagt Ihre Absicht MVC zu verwenden, oder Sie können bereits mit sein. Sobald Sie die Daten getrennt haben (ich nenne es Datenmodellschicht). Jetzt müssen Sie das OBSERVER-Muster auf diese Datenmodellklassen anwenden. Alle Ansichten (Ihre ui-Komponenten), die dieses Datenmodell verwenden, beobachten diese Modellobjekte für jede Änderung (über Beobachtermuster).

Ich hoffe, das ist, was Sie suchen.

1

Ein anderes Muster, das für Sie interessant sein könnte, ist das MVP (Model View Presenter) -Pattern. Dies ist ideal, um Ansichten lockerer an das Modell zu koppeln. Eine gute Erklärung von Todd Snyder finden Sie here.

0

MVC !!! Dann können Sie auch eine Variante von Observer namens Publish/Subscribe verwenden, um den Ereignisfluss in Ihrer App zu implementieren.

0

ich mit den Leuten nicht einverstanden sind, die vorschlagen Event bus zu verwenden, da

  • wegen Code wie EventBus.subscribe(SymbolListChangeEvent.class, this); Ihren ganzen Code auf einem einzigen Ereignis Bus Instanz abhängen, die es sehr schwer zu testen macht,
  • ist es schwierig herauszufinden, wo ein bestimmtes Ereignis verwendet wird.

Stattdessen schlage ich vor, Schnittstellen zu verwenden, um externe Abhängigkeiten eines Moduls einzukapseln. Wenn Sie möchten, können Sie sie mit dem Listener-Muster verwenden, aber in der Regel können Sie alles umgestalten, wenn Sie möchten.

+0

Event Bus bedeutet nicht notwendigerweise, dass der Bus eine Klasse ohne Schnittstelle ist. Warum behaupten Sie das? Im Fall von Mut-Events, Even t Kanäle sind Schnittstellen, die wo nötig injiziert werden (von Guice) und somit leicht zum Testen verwertbar sind. – jfpoilpret

+0

Für den zweiten Punkt stimme ich zu, aber Sie hätten das gleiche Problem mit anderen Ansätzen. Meiner Erfahrung nach habe ich systematisch ein Dokument (mit einer Liste von Ereignissen, Bedeutung, Produzenten und Verbrauchern) auf dem neuesten Stand gehalten, um die Wartung zu erleichtern. – jfpoilpret

+0

Welchen Ansatz schlagen Sie übrigens vor, wenn Ihnen die Event Bus-Lösung nicht gefällt? – jfpoilpret

Verwandte Themen