Java-Pattern Tutorial

Kapitel
Grundlagen Beispielcode UML-Darstellung Übung
Home

Einführung

GUI programmieren

Patterns

   MVC

Verzeichnisse

Einführung

In dieser Einführung wird kurz auf die Geschichte der Programmiersprachen und  die Eigenheiten der objektorientierten Programmierung eingegangen. Im nächsten Kapitel wird etwas zur GUI Programmierung erläutert.

Geschichte der Programmiersprachen

Die ersten Programmiersprachen waren funktionsorientiert.

Beispiele:

  • Fortran
  • Turbo Pascal
  • C
Vorteile Nachteile
  • Kleine Projekte
  • Modellierung einfach (Struktogramm)
  • Mangelnder Schutz der Daten
  • Mangelnde Verständlichkeit
  • Mangelnde Übersicht
  • Mangelnde Wiederverwendbarkeit

Abb. 1.1: Funktionsorientiertes Programmieren

 

Objektorientierter Ansatz

Im objektorientierten Ansatz werden alle Nachteile der funktionsorientierten Programmierung aufgehoben, da Daten hier das Zentrum der Programmentwicklung darstellen.

Abb. 1.2: Objektorientiertes Programmieren

Vorteile Nachteile
  • Hoher Schutz der Daten
  • Hohe Verständlichkeit
  • Hohe Übersicht
  • Hohe Wiederverwendbarkeit
  • Große Projekte
  • Umfangreich zu  lernen und zu verstehen
  • Modellierung aufwändig (UML)
Beispiele
  • Smalltalk
  • C++
  • Java

Wie sich aus den Vor- und Nachteilen ergibt, muss jedoch ein hoher Aufwand für die Modellierung betrieben werden. Dazu ist die UML (Unified Modelliong Language) entwickelt worden.

Die UML

Dieser Modellierungswerkzeugkoffer enthält unterschiedliche Diagrammtypen.

  • Anwendungsfalldiagramm (Use Case)
  • Klassendiagramm
  • Verhaltensdiagramme
    • Aktivitätsdiagramm
    • Kollaborationsdiagramm
    • Sequenzdiagramm
    • Zustandsdiagramm
  • Implementierungsdiagramme
    • Komponentendiagramm
    • Verteilungsdiagramm

In der neuen Spezifikation UML 2.0 kommen andere Diagrammtypen dazu, die die vorhandenen erweitern oder verbessern. Außerdem gibt es Diagramme, die den zeitlichen Ablauf von Programmen beschreiben.

Das Ziel dieser Diagramme ist die Analyse und das Design von objektorientierten Programmen. Dabei zielt alles auf das Erstellen von einem möglichst vollständigen und fehlerlosen Klassendiagramm ab.

Aus diesen Klassendiagrammen können dann Interfaces entwickelt werden.

Interfaces

Interfaces sind also das Ergebnis der objektorientierten Analyse und Design durch die UML. Was genau macht also ein Interface aus?

In einem Klassendiagramm wird von einer vollständigen Klasse ausgegangen. Interfaces werden speziell deklariert.

Abb. 1.3: Klassen und Interfaces in der UML

 

Interfaces sind Vorlagen, mit denen Klassen programmiert werden. Dazu stellen Interfaces leere Methodenrümpfe und gegebenenfalls Konstanten zur Verfügung.

public interface PersonVorlage {

public void setName(String name);

public void setAdresse(String adresse);

public String getName();

public String getAdresse();

}

Tab. 1.1: Beispiel eines Interfaces

Hier sieht das Interface PersonVorlage die Methoden setName(), setAdresse(), getName() und getAdresse() vor. Jede dieser Methoden müssen in der implementierenden Klasse verwendet und ausprogrammiert werden.

Folgendermaßen sieht die Implementierung aus:

public class Person implements PersonVorlage {

private String name = "";
private String adresse = "";

public void setName(String name) {

this.name = name;

}

public void setAdresse(String adresse) {

this.adresse = adresse;

}

public String getName() {

return this.name;

}

public String getAdresse() {

return this.adresse;

}

}

Tab.: 1.2: Implementierung des Interface PersonVorlage

Abstrakte Klassen

Abstrakte Klassen lassen keine Instanziierung zu. Sie dienen wie die Interfaces als Vorlage, wobei es hier erlaubt ist, Methoden und Variablen zu deklarieren. Sie werden oft in der grafischen Programmierung verwendet, um Grundfunktionen vorzugeben.

//Abstrakte Klasse

abstract class Vorlage {

private int code = 0;

public void setCode(int code) {

this.code = code;

}

public int getCode() {

return this.code;

}

public abstract String getName();

}

// Implementierung

public class VorlagenImplementierung extends Vorlage {

// Abstrakte Methode getName()

public String getName() {

return "Vorlagenimplementierung";

}

}

Tab. 1.3: Abstrakte Klasse Vorlage

Somit wird in der abstrakten Klasse ein Attribut und drei Methoden vorgegeben, wobei eine davon abstrakt ist.

Wird die abstrakte Klasse implementiert, so kann die implementierende Klasse auf alle Attribute und Methoden der abstrakten Klasse zugreifen. Die abstrakte Methode muss jedoch noch ausprogrammiert werden.

Nützlich ist so etwas in der grafischen Programmierung, um Grundfunktionalitäten, wie den "Beenden"-Menüknopf  zwar anzulegen, aber erst im Programm auszuprogrammieren.

Adapterklassen

Wiederum handelt es sich um eine Vorlagenklasse. Sie implementieren Interfaces, wobei hier jede Methode des Interfaces übernommen und mit leeren Methodenrümpfen { } versehen werden muss. Ist in der GUI-Programmierung sehr nützlich und gebräuchlich.

// Interface

public interface PersonVorlage {

public void setName(String name);

public void setAdresse(String adresse);

public String getName();

public String getAdresse();

}

// Adapterklasse

public class PersonAdapter implements PersonVorlage {

public void setName(String name) {};

public void setAdresse(String adresse) {};

public void setName(String name) {};

public String getName() {};

}

// Implementierung

public class Person extends PersonAdapter {

private String name = "";

public void setName(String name) {

this.name = name;

}

public String getName() {

return this.name;

}

}

Tab. 1.4: Adapterklasse

Das Nützliche an der Adapterklasse ist, dass Interfaces nur in der Adapterklasse selbst komplett übernommen werden müssen. In die implementierende Klasse müssen nur Methoden eingefügt werden, die für das Programm benötigt werden.

Innere Klassen

Innere Klassen sind Klassendefinitionen innerhalb anderer Klassen (Aggregation). Zu den inneren Klassen gehören auch anonyme Klassen. Diese Klassenarten werden zur grafischen Programmierung und zur Komponentenentwicklung verwendet (Java Beans).

class Aussen {

...

class Mitte { //nur durch Klasse Aussen verwendbar

...

class Innen { //nur durch Klasse Mitte verwendbar

...

}

}

}

Tab. 1.5: Aufbau eines Programms mit inneren Klassen

Innere Klassen
  • Können auf Daten und Methoden der äußeren Klasse zugreifen.
  • Sind den anderen Klassen verborgen.
  • Können nur in der äußeren Klasse erzeugt werden. Ausnahme: Statische innere Klassen.
  • Für jede innere Klasse wird eine eigene .class-Datei erzeugt.

Anonyme Klassen

  • Besitzen keine Namen, da die Klassendefinition und Objekterzeugung in einem Schritt erfolgt.
  • Benötigt, wenn nur eine einzige Objektinstanz benötigt wird.
Vorteile Nachteile
  • grafische Programmierung
  • Keine Wiederverwendung
  • Verkomplizieren die Klassen durch Vererbung

Fazit

In diesem Kapitel haben Sie etwas über die Grundlagen der folgenden Kapitel gelernt. Inhalte waren die Errungenschaften der objektorientierten Programmierung und außerdem die verschiedenen Klassen, die es in Java gibt.

Weiter geht es mit den Grundlagen zum Thema grafische Programmierung (kurz: GUI = Graphical User Interface).