Du hast eine Klasse K und möchtest das Observer-Pattern anwenden, beispielsweise um Änderungen der Instanz-Daten an ein gui zu melden. Mit eclipse geht das flott:
1. Nutze Menü “Refactor” – “Extract Interface” für K und erstelle KInterface.
2. Erstelle eine neue Klasse KGui, die von java.util.Observable erbt.
3. Erschaffe eine private Member-Variable k vom Typ K.
4a. Nutze Menü “Source” – “Generate Delegate Methods …” für k in KGui.
4b. Bei den Methoden, die Daten ändern, ergänze setChanged () und notifyObservers (), nachdem die Daten im “Backend”-Objekt geändert wurden.
5. Ergänze KGui um die Angabe “implements KInterface”. Das ist erfüllt, denn in Schritt 4 hast Du dafür gesorgt.
6. Nutze in Deinem Gui die Klasse KGui statt K. Mach das Gui zu einem Observer von KGui, reagiere passend auf update-Meldungen.
Deine Namen für das Interface und die Gui-Klasse werden vielleicht nicht dem obigen Muster folgen. Je mehr Attribute der Datencontainer hat desto mehr stupide Schreibarbeit erledigt eclipse für Dich.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/** * Nur ein Daten-Container.<br> * <br> * Unpraktisch für das Observer-Pattern. * */ public class JustAName implements JustANameInterface { private String name; @Override public String getName () { return name; } @Override public void setName ( String name ) { this.name = name; } public JustAName ( String name ) { super (); this.name = name; } } /** * eclipse extrahierte dieses Interface. */ public interface JustANameInterface { String getName (); void setName ( String name ); } /** * Ein dekorierter Datenkontainer. Kann alles, was ein Datencontainer kann und * ist ausserdem beobachtbar. So kann es unkompliziert für das Observer-Pattern * genutzt werden. */ public class ObservableJustAName extends Observable implements JustANameInterface { private JustAName jan; public String getName () { return jan.getName (); } public void setName ( String name ) { jan.setName ( name ); setChanged (); notifyObservers (); } } |