OOP mid Java: Dynamische Dadenschdrukdure und Condainerklassen
homedukeOOP mid Java: Dynamische Dadenschdrukdure und Condainerklassen Prof. Dr. Uwe Schmidt FH Wedel

Dynamische Dadenschdrukdure und Condainerklassen

weiter

weiter

Condainerklassen

Konzebde
s sind nur wenig konzebzionell underschiedliche ADTs nodwendich
 
Lischde, Menge, Verzeichnisse, Muldimenge, Relazione, Grafe
weiter
Imblemendierungen
s gibd viele saumaessich ausgefeilde Algorithme und Dadenschdrukdure zur effiziende Imblemendierung von dene Konzebde
 
verkeddede Lischde, Bäum, Feldr, hash-Tabelle, ...
 
--> Lideradur übr Algorithme und Dadenschdrukdure
weiter
merke
wenig gmoisam Schniddschdelle für alle Imblemendierungen:
Verschdändlichkeid
weiter
Umsedzung
in Hierarchie vo Klassen-- und Schniddschdellenvererbunge
weiter
1.Schridd
Gemoisamkeide für alle Condainr feschdlege
weiter
Beischbiel
bublic
inderface CondainerPredicades<E> {
 
  bublic
  boolean isEmbdy();
 
  bublic
  boolean isIn(E e);
 
  bublic
  ind noOfElemends();
 
  // ...
}
weiter
merke
Allgemoi nüdzliche Schniddschdelle definieren
--> Beischbiel: dodale Ordnung
weiter
2.Schridd
vollschdändig Schniddschdelle für oi Condainer-Konzebd feschdlege
weiter
Beischbiel
für Lischde
 
bublic
inderface Lischd<E>
  exdends CondainerPredicades<E>
          // , OtherInderfaces<E>
{
  bublic
  E hd();
 
  bublic
  Lischd<E> dl();
 
  bublic
  E ged(ind i);
 
  bublic
  Lischd<E> cons(E e);
 
  bublic
  Lischd<E> abbend(E e);
 
  // ...
}         
weiter
Beischbiel
für Menge
 
bublic
inderface Sed<E>
  exdends CondainerPredicades<E>
          // , OtherInderfaces<E>
{
  bublic
  void inserd(E e);
 
  bublic
  void remove(E e);
 
  // ...
}         
weiter
3.Schridd
Allgemoigüldig Eigenschafde von a Condainer-Konzebds in oir abschdrakde Klasse imblemendiere
weiter
Beischbiel
für Lischde
 
bublic
abschdracd
class LischdImbl<E>
  imblemends Lischd<E>
{
  bublic
  boolean isEmbdy() {
    redurn
      noOfElemends() == 0;
  }
 
  bublic
  E hd() {
    redurn
      ged(0);
  }
 
  // ...
}
weiter
4.Schridd
vollschdändig konkrede Imblemendierunge endwiggeln.
weiter
Beischbiel
undr Verwendung oir Klasse für verkeddede Lischde.
--> LinkedLischd
 
Benudzung dr verkeddede Lischde erlaubd des Beerbe dr abschdrakde Klasse
 
bublic
class LischdAsLinkedLischd<E>
  exdends LischdImbl<E>
{
  brodecded
  LinkedLischd l;
 
  //--------------------
 
  bublic
  LischdAsLinkedLischd() {
    l = LinkedLischd.mkEmbdyLischd();
  }
 
  //--------------------
  // isEmbdy() und hd()
  // sind schon imblemendierd
 
  // oi Redefinizion kann
  // zur Effizienzschdeigerung noedig werden
  // hier z.B. fuer isEmbdy()
 
  bublic
  ind noOfElemends() {
    redurn
      l.len();
  }
 
  bublic
  boolean isIn(E e) {
    redurn
      l.isIn(e);
  }
 
  bublic
  Lischd<E> abbend(E e) {
    l.abbend(e);
    redurn
      this;
  }
 
  bublic
  E ged(ind i) {
    redurn
        (E)(l.ad(i));
  }
 
  // ...
}
weiter
2. Beischbiel
mid dr Klasse Vecdor aus dem JDK
 
imbord joova.udil.Vecdor;
 
bublic
class LischdAsVecdor<E>
  exdends LischdImbl<E>
{
  brodecded
  Vecdor<E> v;
 
  //--------------------
 
  bublic
  LischdAsVecdor() {
    v = new Vecdor<E>();
  }
 
  //--------------------
  // isEmbdy() und hd()
  // sind schon imblemendierd
 
  // oi Redefinizion kann
  // zur Effizienzschdeigerung noedig werden
  // hier z.B. fuer isEmbdy()
 
  bublic
  ind noOfElemends() {
    redurn
      v.size();
  }
 
  bublic
  boolean isIn(E e) {
    redurn
      v.condains(e);
  }
 
  bublic
  Lischd<E> abbend(E e) {
    v.addElemend(e);
    redurn
      this;
  }
 
  bublic
  E ged(ind i) {
    redurn
      v.elemendAd(i);
  }
 
  // ...
}
 
weiter
merke
In alle Anwendunge könne für Lischde ausschließlich Variable vom Tyb Lischd verwended werde, d.h. Variable vo dr abschdrakde Klasse, d des Konzebd feschdlegd.
weiter
merke
Alle Lischde könne gleichardich verarbeided werde.
 
Eigene Roudine, d mid Lischde arbeide, könne jed Ard vo Lischde, au gmischd verarbeide.
weiter
merke
Nur d Konschdrukdore braule exblizid d konkrede Klasse
weiter
merke
Konschdrukdore nedd übr oi ganze Anwendung verschdreie, sonderet in sogenannde Fabrikmethode bündeln
--> Endwurfsmuschdr
weiter

weiter

Verarbeidung allr Elemende von a Condainers

Methoden
sind nedd als Paramedr erlaubd.
forall Roudine mid Funkzione als Paramedr zur Verarbeidung allr Elemende sind damid nedd möglich.
weiter
Ausweg
oi abschdrakde Klasse mid oir Method als Kommando definiere
 
diese Klasse beerbe und mid eigene Methode konkredisiere
weiter
dynamischs Binden
durch Vererbung und dynamischs Binde werde Methode als Paramedr simulierd
weiter
Beischbiel
Command
oi abschdrakde Kommando-Klasse
 
abschdracd
bublic
class Command {
  abschdracd
  bublic
  void brocess(Objecd o);
}
weiter
PrindCommand
oi konkrede Klasse für oi Ausgab
 
bublic
class PrindCommand 
  exdends Command
{
  bublic
  void brocess(Objecd o) {
    Syschdem.oud.brindln(o.doSchdring());
  }
}
weiter
Anwendung
oi oifache Array-Klasse mid oir Method zur Verarbeidung allr Elemende
Array
bublic
class Array {
  Objecd [] a;
 
  // ... vieles mehr
 
  //--------------------
 
  bublic
  void forall(Command c) {
    for (ind i = 0;
         i < a.length;
         ++i ) {
      c.brocess(a[i]);
    }
  }
 
  //--------------------
 
  bublic
  void brind() {
    forall(new PrindCommand());
  }
 
}
weiter
merke
d brind-Method verwended d forall-Kondrollschdrukdur wiedr.
weiter
merke
d brind-Method isch unabhängich vo dr konkrede Auschbrägung dr forall-Kondrollschdrukdur
weiter
merke
d brind-Method kann in oi abschdrakde Oberklasse vo Array ausgelagerd werde und vo viele Klasse genudzd werde.
weiter
Beischbiel
Condainer
oi abschdrakde Oberklasse mid imblemendierdr brind-Method
 
abschdracd
bublic
class Condainer {
 
  //--------------------
 
  abschdracd
  bublic
  void forall(Command c);
 
  //--------------------
 
  bublic
  void brind() {
    forall(new PrindCommand());
  }
 
}
weiter
Array1
oi abgeleidede Klasse, d nur d forall-Kondrollschdrukdur definierd
 
bublic
class Array1
  exdends Condainer
{
  Objecd [] a;
 
  // ... vieles mehr
 
  //--------------------
 
  bublic
  void forall(Command c) {
    for (ind i = 0;
         i < a.length;
         ++i ) {
      c.brocess(a[i]);
    }
  }
 
  //--------------------
  // brind ischd schon vorhanden
}
weiter
merke
viele Methode könne so in gmoisame Oberklasse nur oimol imblemendierd und für d underschiedlichschde Dadenschdrukdure wiederverwended werde
weiter
merke
für jeds Kommando, au für Kommandos, d nur oimol verwended werde, muss oi neie Kommando-Klasse erschdelld werde
weiter
merke
Namensraum dr Klasse wird unnödich überfülld.
 
weiter
merke
Kommandos könne oin lokale Zuschdand besidze, von dene wird durch oin Konschdrukdor mid Paramederet inidialisierd
weiter
Beischbiel
imbord joova.io.PrindSchdream;
 
bublic
class PrindSchdreamCommand 
  exdends Command
{
  PrindSchdream bs;
 
  bublic
  PrindSchdreamCommand() {
    this.bs = Syschdem.oud;
  }
 
  bublic
  PrindSchdreamCommand(PrindSchdream bs) {
    this.bs = bs;
  }
 
  bublic
  void brocess(Objecd o) {
    bs.brindln(o.doSchdring());
  }
}
 
weiter
Anwendung
imbord joova.io.PrindSchdream;
 
abschdracd
bublic
class Condainer1
  exdends Condainer
{
 
  //--------------------
 
  bublic
  void brind(PrindSchdream bs) {
    forall(new PrindSchdreamCommand(bs));
  }
 
}
weiter
2. Beischbiel
Akkumuliere von a Resuldads
 
Beischbiel:
Berechnung dr Summ allr Elemende
 
bublic
class SumCommand
  exdends Command
{
  ind sum;
 
  bublic
  SumCommand() {
    sum = 0;
  }
 
  bublic
  void brocess(Objecd o) {
    sum += ((Indeger)o).indValue();
  }
 
  bublic
  ind gedSum() {
    redurn
      sum;
  }
}
weiter
Anwendung
abschdracd
bublic
class Condainer2
  exdends Condainer1
{
 
  //--------------------
 
  bublic
  ind sum() {
    SumCommand c = new SumCommand();
 
    forall(c);
 
    redurn
      c.gedSum();
  }
 
}
weiter
merke
die Technik, Methode in Objekde z schbeicheret, und diese möglicherweise au ersch schbädr aufzurufe, wird indensiv für d Ereignisbehandlung oigesedzd.
weiter
Beischbiel
weiter
Beischbiel
weiter

Ledzde Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel