Softwaredesign: Beispiel: Filter-Iterator mit Dekorierer |
// analog zu java.util.Enumeration definiert
public
interface Enumeration {
public
boolean hasMoreElements();
public
Object nextElement();
}
|
// Enumeration fuer Intervalle
// lb <= i < ub
// als Beispiel fuer eine elementare Aufzaehlung
//--------------------
public
class Intervall implements Enumeration {
private
int i, upperBound;
//--------------------
public
Intervall(int lowerBound,
int upperBound) {
this.i = lowerBound;
this.upperBound = upperBound;
}
//--------------------
public
boolean hasMoreElements() {
return
i < upperBound;
}
//--------------------
public
Object nextElement() {
if ( ! hasMoreElements() )
throw
new java.util.NoSuchElementException();
return
new Integer(i++);
}
}
|
// Enumeration fuer Intervalle
// lb <= i < ub
// als Beispiel fuer eine elementare Aufzaehlung
public
class FilterEnumeration implements Enumeration {
private
Enumeration e;
private
Predicate p;
private
Object next;
private
boolean more;
//--------------------
public
FilterEnumeration(Enumeration e, Predicate p) {
this.e = e;
this.p = p;
advance();
}
//--------------------
private
void advance() {
while ( ( more = e.hasMoreElements() )
&&
! p.test(next = e.nextElement()) ) ;
}
//--------------------
public
boolean hasMoreElements() {
return
more;
}
//--------------------
public
Object nextElement() {
if ( ! hasMoreElements() )
throw
new java.util.NoSuchElementException();
Object res = next;
advance();
return
res;
}
}
|
// eine Schnittstelle fuer einstellige Praedikate
public
interface Predicate {
public
boolean test(Object o);
}
|
public
class IsEven implements Predicate {
public
boolean test(Object o) {
return
((Integer)o).intValue() % 2 == 0;
}
}
|
public
class IsPrime implements Predicate {
public
boolean test(Object o) {
return
isPrime( ((Integer)o).intValue() );
}
//--------------------
private
boolean isPrime(int n) {
return
n > 1
&&
smallestDivisor(n) == n;
}
//--------------------
private
int smallestDivisor(int n) {
int i = 2;
while ( i * i <= n && n % i != 0 )
++i;
return
( i * i <= n )
? i
: n;
}
}
|
public
class Test {
public
static
void main(String [] args) {
test(new Intervall(0,20));
test(new FilterEnumeration(new Intervall(0,40),
new IsEven()));
test(new FilterEnumeration(new Intervall(0,100),
new IsPrime()));
}
static
void test(Enumeration i) {
while ( i.hasMoreElements() ) {
System.out.print(" " + i.nextElement());
}
System.out.println();
}
}
|
Letzte Änderung: 04.07.2013 | © Prof. Dr. Uwe Schmidt |