homeSoftwaredesign Softwaredesign: Beispiel: Befehlsmuster für die Ereignisbehandlung in Java Prof. Dr. Uwe Schmidt FH Wedel

Beispiel: Befehlsmuster für die Ereignisbehandlung in Java

weiter

weiter

die Event Klasse: AnEvent

die Klasse taucht im Muster nicht explizit auf, da sie nur für Parameter verwendet wird

public
class AnEvent
  extends java.util.EventObject
{
  public
  AnEvent(Object source) {
    super(source);
  }
}
weiter

weiter

die Schnittstelle für die horchenden Objekte: AListener

hier als Java interface realisiert

public
interface AListener
  extends java.util.EventListener
{
  public
  void performAction(AnEvent e);
}
weiter

weiter

die aufrufende Klasse: ACaller

verwaltet eine ganze Liste von Ereignisbehandlern, in die dynamisch Behandler ein- und ausgetragen werden können.

import java.util.Vector;
 
public
class ACaller {
 
  public
  ACaller() {
    theListeners = new Vector<AListener>();
  }
 
  //--------------------
  
  public
  void doSomething() {
    // ...
    notifyTheListeners();
  }
 
  //--------------------
  // event listener verwalten
 
  private
  Vector<AListener> theListeners;
 
  protected
  void notifyTheListeners() {
    Vector<AListener> l;
    AnEvent e = new AnEvent(this);
 
    synchronized (this) {
      l = (Vector<AListener>)theListeners.clone();
    }
 
    for ( int i = 0;
          i < l.size();
          ++i ) {
      l.elementAt(i).performAction(e);
    }
  }
 
  //--------------------
 
  public
  synchronized
  void addAListener(AListener l) {
    theListeners.addElement(l);
  }
 
  public
  synchronized
  void removeAListener(AListener l) {
    theListeners.removeElement(l);
  }
}
 
weiter

weiter

eine konkrete Klasse zum Behandeln von Ereignissen: ASpecialListener

implementiert die Schnittstelle
bekommt den Verweis auf den Empfänger als Parameter über den Konstruktor

public
class ASpecialListener
  implements AListener {
 
    private
    AReceiver receiver;
 
    public
    ASpecialListener(AReceiver r) {
      receiver = r;
    }
 
    //--------------------
 
    public
    void performAction(AnEvent e) {
      receiver.doIt();
    }
}
 
weiter

weiter

die Empfänger-Klasse: AReceiver

public
class AReceiver {
  public
  void doIt() {
    // ... process event
  }
}
weiter

weiter

die Anwendungs-Klasse: AnApplication

erzeugt die Objekte und verkettet diese über Referenzen

public
class AnApplication {
 
  ACaller c;
  AReceiver r;
 
  public
  AnApplication() {
    c = new ACaller();
    r = new AReceiver();
 
    {
      AListener l = new ASpecialListener(r);
      c.addAListener(l);
    }
  }
}
weiter

Letzte Änderung: 02.11.2016
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel