Beim Design Pattern Delegation werden Aufgaben eines Objektes an ein anderes Objekt (bzw. Objekte) zur Bearbeitung weitergeleitet (delegiert).
Das Aufgaben an andere Objekte weitergeleitet werden ist an sich kein Entwurfsmuster. Normalerweise spricht man vom Entwurfsmuster Delegation dann, wenn man die Funktionalität, die man in einer bestimmten Klasse erwarten würde, an eine andere Klasse delegiert wird.
Ist z.B. wie in Java eine Mehrfachvererbung nicht möglich und es liegen gemeinsame Aufgaben wie in anderen Klassen vor kann durch Delegation ein der Vererbung ähnliches Verhalten erzeugt werden. Die Klassen können ohne Vererbung die gemeinsame Funktionalität an eine andere Klasse auslagern (delegieren).
Für den Fall, dass komplizierte Algorithmen abgebildet werden müssen, kann mit Hilfe von Delegation eine einfachere Quelltextstruktur erreicht werden. Die Bearbeitung von komplexen Teilaufgaben können in einer separaten Klasse gekapsselt werden.
Ein Beispiel für Delegation sind Berechnungsfunktionen. Muss in einer Klasse z.B. mit komplexen Zahlen gerechnet werden, macht es wenig Sinn die Berechnungsfunktionen innerhalb der Klasse zu definieren. Sinnvoller ist die Delegation der Rechenfunktionen an eine spezielle Klasse für komplexe Zahlen, die von allen Klassen verwendet werden kann.
Im Klassendiagramm wird eine Delegation als gerichtete Assoziation dargestellt. Im dargestellten Diagramm delefiert die Klasse "Kunde" eine oder mehrere Aufgaben an die Klasse "Dienst".
Müssen z.B. in einer Klasse komplexe Berechnungen durchgeführt werden kann die Klarheit der Quelltextstruktur darunter leiden. In diesem Fall bietet es sich an Teile der Berechnung in einer anderen Klasse zu bearbeiten (die Berechnung wird delegiert).
Im nachfolgenden Beispiel werden notwendige Berechnungen mit Vektoren an eine Klasse delegiert, die auf Berechnungen mit Vektoren spezialisiert ist. Man sollte sich jedoch vorstellen, dass die Berechnungen, die in der Klasse Vektor ausgefürt werden, eng mit den Methoden der Klasde KomplexerAlgorithmus verbunden sind (man erwartet sie zusammen).
public class KomplexerAlgorithmus{ private Vektor v; ... ... public Vektor starteBerechnung(Vektor v){ ... this.v.add(v); ... return v; } }
public class Vektor { private double x, y, z; public Vektor(){ x = 0.0; y = 0.0; z = 0.0; } public Vektor(double x, double y, double z){ this.x = x; this.y = y; this.z = z; } public void add(Vektor v){ x += x + v.getX(); y += y + v.getY(); z += z + v.getZ(); } public double getX(){ return x; } public void setX(double x){ this.x = x; } public double getY(){ return y; } public void setY(double y){ this.y = y; } public double getZ(){ return z; } public void setZ(double z){ this.z = z; } }
Möchte man Mehrfachvererbung vermeiden, oder sie ist wie z.B. in Java nicht möglich, kann Delegation helfen ein ähnliches Verhalten zu ermöglichen.
Zunächst sei der Aufbau mit Hilfe der Mehrfachvererbung beschrieben:
Geben seien die Klassen Mensch und Tier. Beide Klassen haben als
Basisklasse die Klasse Lebewesen. Als drittes kommt noch die Klasse Unternehmen,
ohne Basisklasse hinzu.
Kommt jetzt noch eine Klasse Kunde hinzu, entsteht Mehrfachvererbung, da ein Mensch als auch ein Unternehmen im Modell Kunden sind, wobei die Klasse Tier kein Kunde ist.
Das nachfolgende Klassendiagramm zeigt das Modell mit Mehrfachvererbung.
Wenn wie z.B. in Java die Mehrfachvererbung nicht unterstützt wird läßt sich ein der Vererbung ähnliches Verhalten mit Hilfe von Delegation erreichen. Hierbei wird eine Klasse KundenDelegate geschaffen, welche die Aufgaben eines Kunden übernimmt. Über die Defintion einer Schnittstelle Kunde, welche von Mensch, Unternehmen und KundenDelegate implementiert wird, erreicht man, dass Unternehemn und Mensch als selber Typ (Kunde) definiert werden kann. Mensch und Kunde delegieren dabei die Schnittstellen-Methoden an ein KundenDelegate.
Das nachfolgende Klassendiagramm zeigt die Auflösung der Mehrfachvererbung mit Hilfe von Delegation.
Die Auflösung hätte auch zu einer Schnittstelle Lebewesen und einer Klasse LebewesenDelegate führen können. Dies muß je nach Komplexität der einzelnen Modellteile entschieden werden.