Logik in Java von GUI trennen?
Hallo,
ich hab ein kleines Problem in Java.
Und zwar hab ich ein Spielbrett mit Feldern. In der Grafischen Oberfläche werden diese Felder durch Buttons repräsentiert. Ich will die Logik aber von meiner Grafischen Oberfläche trennen. Jetzt hab ich mir gedacht mach ich halt eine Klasse Spielfeld die die Logik für ein Feld beinhaltet und gib diese generisch an mein Brett. So kann ich für die grafische Oberfläche einen Spielfeld erzeugen das von Button erbt. Aber genau da ist das Problem Mehrfachvererbung ist in Java nicht erlaubt. Die einzigste Möglichkeit die mir eingefallen ist, ist das die Grafische Oberfläche ein Button object, an eine extra dafür geschriebene Oberklasse von Spielfeld gibt, welches sich dann um den Button kümmert. Das klingt aber nicht ganz sauber. Wie würdet ihr das umsetzen?
Vielen Dank für alle Antworten.
4 Antworten
Benutze am besten das Model-View-Controller-System. Das heißt, du hast einen Controller, der dein Programm steuert. Der steuert die View, die Anzeige. Beide haben Zugriff auf das Model, den Speicher; aber nur der Controller darf die Daten verändern.
Dein Model hält, für ein Spielfeld, ein mehrdimensionales Arrays. Die View hält ein JButton-Array der selben Größer. Jedes Mal, wenn die View neu lädt, holt sie die Daten für die Buttons aus dem Model. Möglicherweise kennt auch jeder Button sein Darstellung im Model.
Du kannst rein theoretisch das 'Klassische' MVC (Model-View-Control) Muster verwenden um deinen Code entsprechend zu strukturieren. - Aber das versuchst du ja bereits. - Du scheiterst eher am direkten umsetzen.
Was ich nur etwas vermisse: Du hast ein Spielbrett - Wie flexibel verhält es sich mit den Spielfeldern? Können es mal mehr, mal weniger Felder sein? Sind die Felder 'fest' ?
Gehen wir mal von einem 3x3 Spielfeld aus, das Fix ist. (Tic-Tac-Toe).
So könnte man, wie im Borderlayout die Buttons per Himmelsrichtung benennen um deren Position festzustellen.
Dein View, in dem du nur den Grafischen Teil behandeln willst, würde für die entsprechenden Felder Getter bereit stellen:
public class Spielbrett { private JButton buttonSouth, buttonNorth, buttonEast; // usw. public JButton getButtonSouth() { return this.buttonSouth; } }
Dein Controller, in dem du die Logik implementieren würdest, hätte dann das Spielbrett als Eigenschaft:
public class Spiel { private Spielbrett spielbrett; }
Hier kannst du dann auch deine Logik der Buttons implementieren:
private void init() { this.spielbrett.getButtonSouth().addActionListener(...); }
Einfachste Idee: Klasse für das Spielbrett die alles dazugehörige macht und dann beim Button click einfach eine Methode des Spielfelds aufrufen und dann halt je nach Rückgabe der Spieleklasse GUI anpassen.
Guck dir mal "Drei-Schichten-Architektur" an.
https://de.wikipedia.org/wiki/Schichtenarchitektur
http://www.mrknowing.com/2013/11/08/wie-funktioniert-die-3-schichten-architektur/
https://www.codeproject.com/Articles/36847/Three-Layer-Architecture-in-C-NET
http://exponential.io/blog/2015/03/05/3-layer-architecture-in-detail/