Model-View-Controller Pattern

Das Model-View-Controller Pattern wird öfters auch mit MVC abgekürzt. Jede Einheit hat klar definierte Aufgaben. Das Model enthält die Daten, die View stellt diese dar und der Controller vermittelt zwischen den beiden Einheiten.

Eingeführt wurde dieser Patterns bei grafischen Anwendungen für Desktop Applikationen. In den letzten Jahren ist es aber auch bei Web Applikation sehr populär geworden.

Ein bekanntes Beispiel für ein Web Framework welches mit MVC arbeitet ist CakePHP.

Ein einfaches Beispiel wäre ein Benutzerprofil. In einer Tabelle werden Name, E-Mail und Passwort eines Users gespeichert. Der User sieht auf einer Webseite seine Daten und kann diese auch bearbeiten. Diese Aufgabe übernimmt die View. Wenn der User seine Änderungen speichern will überprüft der Controller ob sich die Benutzerdaten geändert haben, falls ja übergibt er die Daten dem Model welche den Datenbankeintrag aktualisiert.

Drawing1

Der Vorteil liegt daran, dass die Dateien komplett unabhängig von ihrer Darstellung sind. Das Benutzerprofil könnte über eine Webseite oder über ein Mobile App bearbeitet werden, der Controller definiert die Schnittstelle und das Model bleibt unverändert.

In der Java Welt fällt es öfters schwer Controller und View voneinander zu trennen weil diese eng miteinander verbunden sind. Deswegen spricht man hier öfters von einen Delegate.

 

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

Verhaltensmuster

Das Verhaltensmuster oder auch Behavioral Design Patterns genannt, beschreibt wie Klassen und Objekte zusammenarbeiten. Ein gutes Beispiel für ein Verhaltensmuster ist das Observer Pattern

Ein Objekt ändert seinen Zustand und ein anderes Objekt möchte darüber informiert werden. Wer informiert wenn? Fragt das eine Objekt nach oder wird es informiert? Gilt eine Hol oder eine Bring Schuld?

Die Aufgabe von Verhaltensmuster bestehen darin Vorschläge zu machen welches Objekte welche Aufgabe übernimmt.

Beispiele für Verhaltensmuster