Template Method Pattern

Die Definition dieses Templates lautet:

„Definiere das Skelett eines Algorithmus in einer Operation und delegiere einzelne Schritte an Unterklassen. Die Verwendung einer Schablonenmethode ermöglicht es Unterklassen, bestimmte Schritte eines Algorithmus zu überschreiben, ohne seine Struktur zu verändern.“

Das Template Method Pattern oder auch auf Deutsch Schablonenmethode gehört zu Kategorie der Behavioral Design Patterns. In der abstrakten Parent Klasse wird die Struktur der Methoden definiert. Die genaue Funktionsweise wird aber erst in den dazugehörigen Unterklassen definiert.

Realisierung

Ein einfaches Beispiel lautet wie folgt, ein Programm liest einen eingegeben Text und modifiziert ihn. Eine Methode gibt den Text nur in Großbuchstaben aus während im anderen Fall nur Kleinbuchstaben zurückgegeben werden.

Wir erstellen eine abstrakte Klasse mit dem Namen Eingabe. Die abstrakte Klasse ist nur für das einlesen und auslesen des Textes verantwortlich. Das bearbeiten übernimmt eine Unterklasse.


public abstract class Eingabe{
	public final void run(){
		String eingabe = textEingeben();
		String konvertiert = convert(eingabe);
		drucke(konvertiert);
	}
	private final String textEingeben(){
		final String MESSAGE = "Bitte geben Sie den Text ein: ";
		return JOptionPane.showInputDialog(MESSAGE);
	}	
	protected abstract String convert(String eingabe);
	private final void drucke(String text)
	{
		System.out.println(text);
	}
}

Jetzt werden 2 Unterklassen definiert, wo deklariert ist  auf welche Art und Weise der Text bearbeitet wird. Die Klasse UppercaseConverter wandelt den Text in Großbuchstaben um, während die Klasse LowercaseConverter den Text in Kleinbuchstaben ändert.

Die beiden Klassen unterscheiden sich nur minimal:

LowercaseConverter:

public class LowercaseConverter extends Eingabe{
	@Override
	protected String convert(String eingabe){
		return eingabe.toLowerCase();
	}
}

UppercaseConverter:

public class UppercaseConverter extends Eingabe{
	@Override
	protected String convert(String eingabe){
		return eingabe.toUpperCase();
	}
}

In der Oberklasse ist der Algorithmus definiert und die Oberklasse ruft die entsprechende Methode in der Unterklasse auf. Dieses Verhalten wird auch als das Hollywood-Prinzip bezeichnet.

Hollywood-Prinzip

Rufen Sie uns nicht an – wir rufen Sie an!

Dank des Hollywood Prinzipes kann der Client leicht den gewünschten Converter auswählen:

public class Client{
	public static void main(String[] args){
		Eingabe eingabe = new LowercaseConverter();
		eingabe.run();
		Eingabe neueEingabe = new UppercaseConverter();
		neueEingabe.run();
	}
}	

Zusammenfassung

  • Definition einen Algorithmus
  • Teile des Algorithmus werden von der Oberklasse selbst ausgeführt, andere Teile werden von Subklassen vorgeschrieben, die die nicht abstrakten Teile implementieren
  • Den Algorithmus beschreiben Sie in einer finalen Methode der abstrakten Oberklasse

Strukturmuster

Strukturmuster oder auch Structural Design Patterns beschreiben wie Klassen zusammengesetzt werden, um größere Einheiten zu bilden. Die einfachste Art um sich ein Strukturmuster vorstellen ist der Adapter. Ein klassischer Adapter außerhalb der Coding Welt kennen wir von Steckdosen.

Im Ausland benötigen wir einen Adapter, damit unser Geräte an die dortigen Steckdosen angesteckt werden können.

Beispiel für Strukturmuster sind:

  • Adapter
  • Facade Pattern
  • Proxy

Singleton Pattern

Der Singleton Pattern ist einer der einfachsten Patterns. Er gehört zur Art der Creational Patterns.

Definition des Patterns laut der Gang of Four:

„Sichere ab, dass eine Klasse genau ein Exemplar besitzt, und stelle einen globalen Zugriffspunkt darauf bereit.“

Singleton Patterns werden verwendet wenn es nur eine Instanz von einer Klasse erlaubt ist. Dieses Pattern findet öfters Verwendung bei Verwaltung der Benutzerrechte einer Applikation.

Realisierung

Um die Realisierung in Java zu gewährleisten muss der Konstruktor auf private gesetzt werden. Damit ist der Zugriff nur innerhalb der Klasse oder durch andere Instanzen der Klasse möglich.

Als nächstes wird eine Methode definiert, die eine Instanz erstellt falls es noch keine gibt. Die Instanz der Klasse wird an den Aufrufer zurück gegeben.

Mithilfe eines statischen Feldes wird eine Referenz auf die Instanz gehalten. Wichtig ist die Instanz zum spät Möglichsten Zeitpunkt zu erstellen. Sprich bei der ersten Verwendung während der Laufzeit (lazy instantiation).


public class SingletonPattern {
  private staticSingletonPattern instance = null;
  private SingletonPattern() {}
  public static SingletonPattern getInstance() {
    if(instance == null) {
       instance = new SingletonPattern();
    }
    return instance;
  }
}

Kritik an Singleton

  • Jede Klasse soll sich nur auf eine Aufgabe konzentrieren. (Single Responsability Prinzip). Der Singleton Pattern hält sich nicht an dieses Prinzip. Sowohl Geschäftslogik als auch die Objekterzeugung wird in dieser Klasse umgesetzt.
  • Wie bei globalen Variablen ist die Abhängigkeit nicht sofort sichtbar. Ob eine Klasse die Singleton-Klasse verwendet ist nur im Code ersichtlich.
  • Singleton erschaffen eine Art von „globalen“ Zustand und erschweren somit die Testbarkeit.
  • Sofern die Instanz selber Attribute besitzt sind diese überall verfügbar.

Zusammenfassung

  • Singleton wird eingesetzt, wenn eine Klasse nur eine Instanz besitzen darf
  • Die Instanz braucht einen globalen Zugriffspunkt
  • Die Instanz soll zum spät Möglichsten Zeitpunkt erzeugt werden