homeSoftwaredesign Softwaredesign: Beispiel: Strategie zum Implementieren von default-Methoden für Container Prof. Dr. Uwe Schmidt FH Wedel

Beispiel: Strategie zum Implementieren von default-Methoden für Container

weiter

weiter

eine (unvollständige) Schnittstelle für Container

interface Container {
    boolean isEmpty();
    int card();
    int sum();
    Object maximum();
 
    Object processAll(Command c);
}
weiter

weiter

eine Schnittstelle für Kommandos

interface Command {
    void process(Object e);
    Object getResult();
}
weiter

weiter

eine abstrakte Klasse mit vielen default-Implementierungen

abstract public
class ContainerDefaults
  implements Container {
 
    public boolean isEmpty() {
        return card() == 0;
    }
 
    public int card() {
        Command c = new Command() {
                // anonyme Klasse !
 
                int res = 0;
 
                public void process(Object e) {
                    ++res;
                }
 
                public Object getResult() {
                    return new Integer(res);
                }
            };
        return ((Integer)processAll(c)).intValue();
    }
 
    public int sum() {
        Command c = new Command() {
                // anonyme Klasse !
 
                int res = 0;
 
                public void process(Object e) {
                    res += ((Integer)e).intValue();
                }
 
                public Object getResult() {
                    return new Integer(res);
                }
            };
        return ((Integer)processAll(c)).intValue();
    }
 
    public Object maximum() {
        Command c = new Command() {
                // anonyme Klasse !
 
                Comparable res = null;
 
                public void process(Object e) {
                    if (res == null || res.compareTo(e) < 0)
                        res = (Comparable)e;
                }
 
                public Object getResult() {
                    return res;
                }
            };
        return processAll(c);
    }
 
 
}
weiter

weiter

ein konkreter Container mit nur einer noch zu implementierenden Methode

public class Array extends ContainerDefaults {
    protected Object [] a;
 
    public Array(Object [] a) {
        this.a = a;
    }
 
    public Object processAll(Command c) {
        for (int i = 0; i < a.length++i) {
            c.process(a[i]);
        }
        return c.getResult();
    }
}

weiter

Fragen

merke
Wieviele Methoden werden bei einem Aufruf von sum aufgerufen?
merke
Wieviele Hilfsobjekte werden bei einem Aufruf von sum erzeugt?
merke
Wieviele Hilfsobjekte werden bei einem Aufruf von maximum erzeugt?
merke
Könnten die Objekte, die aus den anonymen Unterklassen von Command erzeugt werden, auch als Singleton verwaltet werden?
merke
Kann die Schnittstelle Command vereinfacht werden?
merke
Kann mit dieser Strategie auch eine allgemeine toString-Methode für Container implementiert werden?

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