Muster: Java: TemplateMethod

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Schablonenmethode[Bearbeiten]

Lege den Algorithmus fest und überlasse die Ausgestaltung von einzelnen Teilen Unterklassen. (vgl. WikiBook Muster)

Implementierung (1)[Bearbeiten]

 package org.wikibooks.de.java.pattern;
 public abstract class AbstractSchablonenMethodeFenster {
   public AbstractSchablonenMethodeFenster () {
     this.initGUI ();
   }
   // Eine Klasse mit mind. einer abstrakten ...
   protected abstract void initAction ();
   // ... und mind. einer konkreten (Schablonen)Methode.
   public void initGUI () {
     // Den Aufruf von abstrakten Methoden innerhalb der konkreten (Schablonen)Methode.
     this.initAction ();
     this.initMenu ();
     // ...    
   }
 }
 package org.wikibooks.de.java.pattern;
 public class DefaultSchablonenMethodeFenster extends AbstractSchablonenMethodeFenster {
   private Action exitOnCloseAction;
   private JMenu fileMenu;
   private JMenuItem exitApplication;
   protected void initAction () {
     exitOnCloseAction = new AbstractAction ("Beenden", null) {
       public void actionPerformed (final ActionEvent exit) {
         System.exit (0);
       }
     }
   }
   protected void initMenu () {
     JMenuBar menueLeiste = new JMenuBar ();
     fileMenu = new JMenu ("Datei");
     exitApplication = new JMenuItem (this.exitOnCloseAction);<br>
     fileMenu.add (exitApplication);
     menueLeister.add (fileMenu);
     this.setJMenuBar (menueLeiste);
   }
 }

Erläuterungen[Bearbeiten]

Das vorstehende Beispiel zeigt Dir die Schablonenmethode anhand einer einfachen grafischen Oberfläche mit Swing. Gehen wir das Beispiel von hinten her an.

 exitApplication = new JMenuItem (this.exitOnCloseAction);

Hiermit weisen wir dem Menüeintrag ein Action Objekt zu. Damit dies funktioniert muss das Action Objekt jedoch vorher initialisiert werden, da Du sonst eine NullPointerException bekommst.
Wir haben zur besseren Übersichtlichkeit die Initialisierung unserer Action Objekte in eine eigene Methode ausgelagert.

 protected void initAction ()

Nun müssen wir sicherstellen, dass vor der Zuweisung zu unserem Menüeinträgen die Action Objekte auch initalisiert sind. Natürlich könnten wir einfach in der Dokumentation dies so beschreiben - aber wir können es besser. Wir definieren eine Superklasse (AbstractSchablonenMethodeFenster) in der wir eine Schablonenmethode anlegen.

 public void initGUI ()

In dieser Schablonenmethode definieren wir die genauer Abfolge der Aufrufe und stellen somit den korrekten Programmablauf sicher.

Anmerkung (1): Als kleines Bonbon nutzen wir gleich noch eine Einschränkung der Sichtbarkeit (protected) damit kein DAP (dümmster anzunehmender Programmierer) die Methoden separat in der falschen Reihenfolge aufruft.

Anmerkung (2): Als Schmanckl haben wir zusätzlich noch den Aufruf der initGUI Methode in den einzigen Konstruktor der Superklasse gepackt. Die Umgehung unseres Algorithmus ist nun schon auf versierte Programmierer eingeschränkt.