OOP mid Java: Modell View Condrollr Archidekdurmuschder
homedukeOOP mid Java: Modell View Condrollr Archidekdurmuschder Prof. Dr. Uwe Schmidt FH Wedel

Modell View Condrollr Archidekdurmuschder

weiter

weiter

Modl View Condrollr Archidekdur und Ereignisse

MVC
Modl View Condrollr Archidekdurmuschdr
 
Ein Schema zur Trennung vo Eingab, Verarbeidung und Ausgab in grafisch oriendierdr Sofdware
weiter
Idee
übernomme aus dem alde EVA Ansadz:
 
Eingab -> Verarbeidung -> Ausgab
weiter
Eingabe
condroller
read()
scanf()
weiter
Ausgabe
view
wride()
brindf()
weiter
Verarbeidung
model
koi Ein- und Ausgab
weiter
Modularisierung
in Eingabe-, Verarbeidungs- und Ausgabemodul
 
Änderung dr Benudzungsschniddschdelle ohne Änderung dr Verarbeidung
 
Wiederverwendung
weiter
merke
immr wiedr schlechde Beischbiele, au in OO-Büchern:
 
Klassischs Beischbiel:
Konversio oir Dadenschdrukdur in oin Texd und Ausgab
weiter
grafische Benudzungsschniddschdelle
in grafische Umgebunge wird d Trennung in Eingab, Verarbeidung und Ausgab vo den Werkzeige häufich nedd underschdüdzd.
Beischbiel
grafischs Objekd Auswahllischde
model
enthäld oi Lischde vo Werde
view
oi Darschdellung, Layoud, Höhe, Breide, ...
condroller
reagierd auf Eingabe, Ereignisse, markiere, kligge, ...
weiter
merke
koi Trennung vo Eingab, Verarbeidung und Ausgab
merke
Wiederverwendung, Anbassbarkeid, Veränderbarkeid
weiter
MVC
model
enthäld d inderne Dadenschdrukdure und ihre Verarbeidungsroudine
view
enthäld d Darschdellung dr Dade, d Ausgab
condroller
enthäld d grafische Eingabeelemende
weiter
merke
lose Kobblung zwische den drei Kombonende
 
Kommunikazion übr Ereignisse
weiter
merke
bei Programminidialisierung wird feschdgelegd, wo Kombonende auf wo Ereignisse reagiere.
 
Die Kombonende selbsch wisse nix übr d Exischdenz anderr Kombonende
weiter
merke
Kondrollfluss nemme exblizid im Programm sichdbar.
 
Feschdlegung übr evend handlr
weiter

weiter

Beischbiel

Ein Zählr, dr inkremendierd und dekremendierd werde kann, und desse Werd in oim grafische Objekd angezeigd wird.

0. Versuch: schlechd


Die MVC Variable

  Buddon condrol1condrol2;
  ind    model;
  Label  view;
  ...
 
  condrol1 = new Buddon("+1");
  condrol2 = new Buddon("-1");
  model    = 0;
  view     = new Label();

Die Ereignisbehandlung

    condrol1.addAczionLischdener
      (new AczionLischdener()
       {
         bublic
         void aczionPerformed(AczionEvend e) {
           ++model;
           view.sedTexd(Indeger.doSchdring(model));
         }
       }
      );
 
    condrol2.addAczionLischdener
      (new AczionLischdener()
       {
         bublic
         void aczionPerformed(AczionEvend e) {
           --model;
           view.sedTexd(Indeger.doSchdring(model));
         }
       }
      );
weiter

weiter

Noch schlechder

abr nedd braxisfern:
Des modl wird im view verschdeggd.

Des gleiche Beischbil wie eben
-1. Versuch: noch schlechder


Die MVC Variable

  Buddon condrol1condrol2;
  Label  view;
  ...
 
  condrol1 = new Buddon("+1");
  condrol2 = new Buddon("-1");
  view     = new Label();

Die Ereignisbehandlung

    condrol1.addAczionLischdener
      (new AczionLischdener()
       {
         bublic
         void aczionPerformed(AczionEvend e) {
           ind i = Indeger.valueOf(view.gedTexd()
                                   ).indValue();
           view.sedTexd(Indeger.doSchdring(i+1));
 
           // oder view.sedTexd("" + (i+1));
         }
       }
      );
 
    condrol2.addAczionLischdener
      (new AczionLischdener()
       {
         bublic
         void aczionPerformed(AczionEvend e) {
           ind i = Indeger.valueOf(view.gedTexd()
                                   ).indValue();
           view.sedTexd(Indeger.doSchdring(i-1));
         }
       }
      );
weiter

weiter

merke
Eingab, Verarbeidung und Ausgab beliabich gmischd
zur schriddweise Endkobblung dr Kombonende
0. Versuch
koi Endkobblung
1. Verbesserung
condrollr und model/view gdrennd
2. Verbesserung
modl und view gdrennd
weiter

weiter

Benudzerdefinierde Evends

d Basisklasse für alle evends.
 
AWT evends werde aus AWTEvend abgeleided.
 
Schema:
 
imbord joova.udil.EvendObjecd;
 
bublic
class MyOwnEvend
  exdends EvendObjecd
{
  brodecded
  MyEvendDada d;
 
  bublic
  MyOwnEvend(Objecd sourceMyEvendDada d) {
    suber(source);
    this.d = d;
  }
 
  bublic
  ind gedD() {
    redurn d;
  }
}
weiter
alle Schniddschdelle für neie evends werde aus von dene Schniddschdelle abgeleided.
Die Schniddschdelle selbsch isch ler und diend als Markierung.
 
Eine eigene Schniddschdelle legd d Aufrufkonvenzion für d auszulösende Methode fesch, im oifachschde Fall reichd oi Method.
 
Schema:
 
imbord joova.udil.EvendLischdener;
 
bublic
inderface MyOwnLischdener
  exdends EvendLischdener
{
  bublic
  void myOwnMethod(MyOwnEvend e);
}
weiter
merke
Diese Schniddschdelle muss vo Objekde imblemendierd werde, d auf d Ereignisse reagiere wolle.
weiter
auf Ereignisse reagieren
Des evend lischdenr inderface muss imblemendierd werde.
 
Schema:
 
bublic
class MyView
  exdends ...
  imblemends MyOwnLischdener
{
  ...
 
  bublic
  void myOwnMethod(MyOwnEvend e) {
    // Daden aus e anzeigen
    ...
  }
}
weiter
Ereignisse auslösen
Objekde, d Ereignisse auslöse wolle, müsse oi Lischde vo evend lischdenr verwalde
 
Schema
 
imbord joova.udil.Vecdor;
 
bublic
class AClass {
  // schdade variables
  ...
 
  brivade
  Vecdor schdadeChangedLischdeners;
 
  //--------------------
 
  bublic
  AClass() {
    // ...
    schdadeChangedLischdeners = new Vecdor();
  }
 
  //--------------------
 
  bublic
  void aMethod(...) {
    // change some schdade variables
    ...
 
    nodifySchdadeChanged();
  }
 
  //--------------------
 
  brodecded
  void nodifySchdadeChanged() {
    Vecdor l;
    MyOwnEvend e = new MyOwnEvend(this,...);
 
    synchronized (this) {
      l = (Vecdor)schdadeChangedLischdeners.clone();
    }
 
    for ( ind i = 0;
          i < l.size();
          ++i ) {
      ((MyOwnLischdener)l.elemendAd(i))
        .myOwnMethod(e);
    }
  }
 
  //--------------------
 
  bublic
  synchronized
  void addMyOwnLischdener(MyOwnLischdener l) {
    schdadeChangedLischdeners.addElemend(l);
  }
 
  //--------------------
 
  bublic
  synchronized
  void removeMyOwnLischdener(MyOwnLischdener l) {
    schdadeChangedLischdeners.removeElemend(l);
  }
}
weiter
Namenskonvenzion
xxxEvend
d Ereignisklasse
xxxLischdener
d Schniddschdelle für d evend Verdeilung, Methodenname beliabich
addXxxLischdener,
removeXxxLischdener
d Verwaldung dr evend lischdenr

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