InfoHome | Themen | Projekte | Links | Software |
|
Composite PatternUnter einem Pattern versteht man im allgemeinen ein Entwurfsmuster. Bei der Erstellung graphischer Oberflächern in Java findet das Composite Pattern Anwendung. Die graphische Oberfläche setzt sich aus einfachen Komponenten (=Objekten) zusammen, die in Container-Objekten zusammengefasst werden, die ihrerseits wieder in noch größeren Containern stecken, usw.
VererbungBei der Umsetzung dieses Patterns in Java ist das Vererbungskonzept von zentraler Bedeutung. Eine neu erstellte Klasse kann dabei von einer anderen Klasse abgeleitet (Schlüsselwort extends) werden. Die abgeleitete Klasse erbt alle Funktionalität von der Oberklasse (auch Superklasse genannt), d.h. sie besitzt dieselben Datenfelder und Methoden. Desweiteren lässt sich in der abgeleiteten Klasse zusätzliche Funktionalität unterbringen (weitere Datenfelder und Methoden). Ein fortgesetztes Ableiten führt so zu einer zunehmenden Spezialisierung. In Unterklassen können Methoden aus Oberklassen auch überschrieben werden. Auf der obersten Stufe der Java-Klassenhierarchie steht die Klasse Object. Jede selbst erstellte Klasse erbt von der Klasse Object wenn nicht eine andere Oberklasse explizit angegeben wird. Die Klasse Object enthält natürlich nur ganz allgemeine Funktionalität (selbst mal in der Java-Dokumentation nachschlagen!). Ein zusätzliche Besonderheit der Klasse Object ist, dass es sich um eine abstrakte Klasse handelt (Schlüsselwort abstract). Von solchen Klassen lassen sich keine Objekte erzeugen. Erst in abgeleiteten Klassen ist dies dann möglich. Neben abstrakten Klassen gibt es auch abstrakte Methoden. Eine abstrakte Methode besteht schlicht aus einer Signatur. Enthält eine Klassen eine abstrakte Methode, so ist die Klasse selbst abstrakt. Erst wenn in einer abgeleiteten Klasse die abstrakte Methode implementiert wird, lassen sich Objekte erzeugen. 1. Beispiel: Ableiten ganzrationaler FunktionenGanzrationale Funktionen entstehen durch Summen- und Produktbildung aus konstanten Funktionen f(x)=c und der Identität f(x)=x. An diesem Beispiel soll das Composite Pattern nun exemplarisch angewendet werden. Zur Bestimmung der Ableitung an einer bestimmten Stelle x benötigen wir die Ableitungsfunktion und ihren Funktionswert. In unserer abstrakten Oberklasse Funktion sehen wir also zwei Methoden vor, die genau das leisten: public abstract class Function {
Zu beachten ist hier, dass die Methode getDerivative() keinen Wert sondern ein Funktionsobjekt zurückliefert. Nun kommen wird zu den einfachen Bestandteilen der ganzrationalen Funktionen. Zunächst die Konstanten: public class Constant extends Function { Die Klasse 'Constant' wird von der Klasse 'Function' abgeleitet und implementiert die vorgesehenen Methoden. Darüberhinaus enthält sie ein Datenfeld zur Speicherung des konstanten Wertes und einen Konstruktor. In einem Hauptprogramm lassen sich nun konstante Funktionen erzeugen, an einer Stelle x auswerten. Möchte man den Wert der Ableitung einer konstanten Funktion f an der Stelle x, schreibt man f.getDerivative().getOutput(x)! Und jetzt zur Identität: public class Id extends Function { Nach diesen einfachen Bestandteilen kümmern wir uns um die Klassen für Summe und Produkt, die jeweils aus zwei Objekte vom Typ Funktion zusammengesetzt werden. public class Sum extends Function {
public class Product extends Function {
Ein Hauptprogramm zum Testen unserer Klassen könnte folgendermaßen aussehen: public class Main { Das Testprogramm berechnet den Funktionswert an der Stelle x=2 und den Wert der Ableitungsfunktion an der Stelle x=2. "Ableitung von Funktionen"-Projekt als Anwendung des Composite-PatternsDie Rolle der allgemeinen Oberklasse spielt die abstrakte Klasse 'Function'. Einfache Klassen sind die Klassen 'Constant' und 'Id'. Zusammengesetzte Klassen sind die Klassen 'Sum' und 'Product'. Statt einer Methode 'add' zum Hinzufügen eines Funktionsobjekts zu einem Objekt einer zusammengesetzten Klasse verwenden wir hier den Konstruktor der Klassen 'Sum' bzw. 'Product', um aus zwei einfachen Objekten ein zusammengesetztes Objekt zu erzeugen. ErgänzungenErgänzung 1: Ausgabe des AbleitungstermsUm den Term der Funktion (und damit auch jeder Ableitungsfunktion) ausgeben zu können, formulieren wir eine weitere abstrakte Methode printFunction() in unserer Oberklasse 'Function'. public abstract void printFunction(); Diese Methode muss nun in allen abgeleiteten Klassen implementiert werden. In der Klasse 'Constant': public void printFunction(){ In der Klasse 'Id': public void printFunction(){ In der Klasse 'Sum': public void printFunction(){ und in der Klasse 'Product': public void printFunction(){ Klammern nicht vergessen! (Warum?) Ergänzung 2: Ableitung von Sinus- und KosinusfunktionenStellen Sie die Funktion h(x) = 5*x + sin(3*x + 4) mit Hilfe der in diesem Projekt erstellten Klassen dar. Für die hierbei verwendeten trigonometrischen Funktionen entwerfen Sie zwei neue Klassen 'Sine' und 'Cosine' die entsprechend sin(a(x)) und cos(a(x)) darstellen. Für die Ableitung dieser Funktionen verwenden Sie die aus dem Mathematikunterricht bekannte Kettenregel. public class Sine extends Function { public class Cosine extends Function {
Ergänzung 3: Ausgabe einer Wertetabelle
|
© 2004-2024 M. Blanke · Ursulaschule · Kleine Domsfreiheit 11-18 · 49074 Osnabrück |