Softwaredesign: Beispiel: Befehlsmuster für die Ereignisbehandlung in Java |
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);
}
}
|
hier als Java interface realisiert public
interface AListener
extends java.util.EventListener
{
public
void performAction(AnEvent e);
}
|
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);
}
}
|
implementiert die Schnittstelle public
class ASpecialListener
implements AListener {
private
AReceiver receiver;
public
ASpecialListener(AReceiver r) {
receiver = r;
}
//--------------------
public
void performAction(AnEvent e) {
receiver.doIt();
}
}
|
public
class AReceiver {
public
void doIt() {
// ... process event
}
}
|
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);
}
}
}
|
Letzte Änderung: 02.11.2016 | © Prof. Dr. Uwe Schmidt |